线程的重要问题。
出现不安全的情况:
(1)多线程并发;(2)多个线程共享数据;(3)共享数据有修改行为;
会出现不安全的变量:
静态变量、实例变量(存储在方法区和堆区,可能共享)
局部变量(不会出现不安全问题,存储在栈里)
解决方法:
使用线程同步机制,就是停止线程并发,依次进行,会牺牲效率。
线程同步涉及到同步和异步编程模型。异步即并发,同步即排队。
一个例子,存款10000,两个线程各取5000,可能出现账户余额还有5000。因为可能在t1线程获取到bankMoney是10000时,t2也恰好此时获取到是10000,然后t1执行取款操作剩5000,t2也剩5000。最后取了两次还剩5000。

//账户对象
public class Account {
private String act;
private int bankMoney;
public String getAct() {
return act;
}
public void setAct(String act) {
this.act = act;
}
public int getBankMoney() {
return bankMoney;
}
public void setBankMoney(int bankMoney) {
this.bankMoney = bankMoney;
}
public void withdraw(int money) {
int before=this.bankMoney;
int after=before-money;
this.bankMoney=after;
}
}
//进程对象
public class AccountThread extends Thread{
private Account act;
public AccountThread(Account act) {
this.act=act;
}
public void run() {
act.withdraw(5000);
System.out.println(Thread.currentThread().getName()+"取款成功,账户余额:"+act.getBankMoney());
}
}
public class test {
public static void main(String[] args) {
Account act=new Account();
act.setAct("act001");act.setBankMoney(10000);
AccountThread t1=new AccountThread(act);
AccountThread t2=new AccountThread(act);
t1.setName("t1");t2.setName("t2");
t1.start();t2.start();
}
}
多线程并发中的数据安全与同步:银行存款案例剖析
3229

被折叠的 条评论
为什么被折叠?



