class ThreadDemo4
{
public static void main(String[] args)
{
Consumer c=new Consumer();
Thread t1=new Thread(c);
Thread t2=new Thread(c);
t1.start();
t2.start();
}
}
//定义一个银行类
class Bank
{
private int sum;
Object obj=new Object();
public void add(int num){
sum+=num;
System.out.println("sum="+num+"..."+Thread.currentThread().getName());
}
}
//定义一个客户类
class Consumer implements Runnable
{
private Bank bank=new Bank();
public void run(){
for(int i=0;i<3;i++){
bank.add(100); //一次存100,循环3次
}
}
}
这个是毕老师讲课的一个小程序:2个人去银行存钱,总共存3次一次存一百,然后打印出银行的总金额
这个程序不安全性的问题是add方法内,如果先执行sum+=num这句话,然后被别的线程抢去执行,就会发生错误(有时候同时输出两个200,但为什么不同时输出两个300或者其他呢),我现在把add内方法改写成System.out.println("sum="+(sum+=num)+"..."+Thread.currentThread().getName());,去掉上面这句,为什么还会出现这种问题? |