class IceBox implements Runnable{
private int stic=30;
private Object obj=new Object();
public void run(){
while(true){
synchronized(obj){
if(stic>0){
//try{Thread.sleep(1)}catch(InterruptedException){};
System.out.println(Thread.currentThread().getName()+"拿了一块棒冰"+"..........."+"余额为"+(--stic));
}
}
}
}
}
public class text30{
public static void main(String[] args){
IceBox I=new IceBox();
Thread t1=new Thread(I,"爸爸");
Thread t2=new Thread(I,"妈妈");
Thread t3=new Thread(I,"我");
t1.start();
t2.start();
t3.start();
}
}
/*
多线程安全的产生条件:多个线程共享了一个数据,由于cpu切换线程的随机性,导致多个线程都满足了run()中的判断而进入了该方法,但是因为多个线程共享了一个数据,那么当一个线程运行完后
导致下面的数据不满足run()中的判断条件但是前面其它多个线程都已经进入了改方法,从而导致了错误。
多线程安全解决方法:为了解决该安全问题,我们就应该给多线程共享的那个代码块封装起来并且上把锁,这个锁有synchroniazed(对象){代码块}创建,但是我们要注意的是在对象的选择上我们要选择一个对象,不然不同对象给它们上了不同的锁,也就起不到该有的作用了。
*/