多线程的安全

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(对象){代码块}创建,但是我们要注意的是在对象的选择上我们要选择一个对象,不然不同对象给它们上了不同的锁,也就起不到该有的作用了。

*/

原文地址:https://www.cnblogs.com/daoxiang1992/p/5698856.html