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());
}
}
运行结果视图



