线程之线程安全解决

/**
 * 线程安全问题产生的解决思路:
 * 就是将多条操作共享数据的线程代码封装起来,当有线程在执行这些代码的时候
 * 其它线程时不可以参与运算的
 * 必须要当前线程把这些代码都执行完毕后,其它线程才可以参与运算
 * 
 * 在java中,用同步代码块就可以解决这个问题
 * 
 * 同步代码块的格式:
 * synchronize(对象)
 * {
 *    需要被同步的代码;
 * }
 * 
 * 同步的好处:解决了线程的安全问题
 * 
 * 同步的弊端:相对降低了效率,因为同步外的线程都会判断同步锁
 * 
 * 同步的前提:必须有多个线程并使用同一个锁
 * @author 罗摩衔那
 *
 */

class Tick1 implements Runnable{

     private int num=100;//定义一百张票
     Object obj=new Object();     
     public void run() 
     {
         while(true)
         {
             synchronized(obj)
           { 
             if(num>0)
             {
                 try {Thread.sleep(10);}catch(InterruptedException e) {}
                 
                 System.out.println(Thread.currentThread().getName()+"...sale..."+num--);
             }
           }
         }
     }
}
public class Ticket_Demo3 
{
   public static void main(String[] args) 
   {
      Tick1 d=new Tick1();//创建一个线程任务对象
      
      Thread t1=new Thread(d);
      Thread t2=new Thread(d);
      Thread t3=new Thread(d);
      Thread t4=new Thread(d);
      
      t1.start();
      t2.start();
      t3.start();
    }
}

温馨小提示:如果不加入synchronize(对象){}函数块,就会出现线程安全现象的产生.synchronize中的对象相当于一把锁,个人理解为缓存区,一旦一个线程进入就必须执行完己身任务,相当于缓存区已满,其它线程就无法进入.

原文地址:https://www.cnblogs.com/zjm1999/p/9879644.html