1、多线程并发
2、有共享数据
3、并发的线程对共享的数据有更新的 *** 作
使用的方法为使用线程同步机制(线程同步就是线程排队执行),效率会低但是可以保证数据的安全,
线程同步1、同步编程模型
线程之间轮流执行,一个线程执行完之后,一个线程一个线程才能开始执行,不同同时执行,同步编程模型时线程之间会排队进行。
2、异步编程模型
线程之间谁也不影响谁,线程之间同步进行。也可以称为线程的并发执行。
package DuoXianCheng; public class Account { private String accout; private double bluance; public Account() { } public Account(String accout, double bluance) { this.accout = accout; this.bluance = bluance; } public String getAccout() { return accout; } public void setAccout(String accout) { this.accout = accout; } public double getBluance() { return bluance; } public void setBluance(double bluance) { this.bluance = bluance; } public void quKuan(double bluance,AccountThread accountThread){ double before = this.getBluance(); double after = before-bluance; if(accountThread.getName().equals("t2")){//在这里如果将t2改为t1的话,尽管我们对同一个账户做了两次取款 *** 作,但是账户余额的变化只会有记录一次取款 *** 作 try { accountThread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } this.setBluance(after);//这里还没有来的及更新第二次取款 *** 作已经获取到了未更新之前的余额,也就是说尽管我们做了两次取款 *** 作 //但是我们是在相同的余额的情况下进行的,改变的是相同的余额。 //这样 *** 作我们就可多获取一笔钱了。 } }class Mian
package DuoXianCheng; public class Mian { public static void main(String[] args) { Account account = new Account("001",10000); AccountThread t1 = new AccountThread(account); AccountThread t2 = new AccountThread(account); t1.setName("t1"); t2.setName("t2"); t1.start(); t2.start(); } }class AccountThread
package DuoXianCheng; public class AccountThread extends Thread{ Account account; public AccountThread(Account account) { this.account = account; } @Override public void run() { double money=5000; account.quKuan(money,this); System.out.println(Thread.currentThread().getName()+account.getAccout()+":"+account.getBluance()); } }运行结果视图
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)