线程同步

线程同步

同步代码块

synchronized(监视器){

//共同享用的代码块

}

多个线程在抢夺cpu执行权,在执行run()方法,遇到synchronized代码块时,会检查是否有锁对象,如果有,就继续执行下去。反则,该线程就会进入阻塞状态。直到锁对象被释放,多个线程就会继续抢夺cpu执行权。

Object obj = new Object();//监视器

public void run() {

           while(true){
               synchronized (obj){
                   if(tickets>0) {
                       System.out.println(Thread.currentThread().getName() + "-->" +"正在出售第"+tickets+"票");
                       tickets--;
                  }
              }

          }

  }

同步方法

1.把共同访问的数据总结抽取出来,放进一个方法里面。

2.格式是 :修饰符 synchronized 返回值类型 方法名(参数列表){

//共享的数据;

}

public void run() {

       while(true){
           sell();
      }

  }

   public synchronized  void sell(){
       synchronized (obj){
           if(tickets>0) {
               System.out.println(Thread.currentThread().getName() + "-->" +"正在出售第"+tickets+"票");
               tickets--;
          }
      }
  }

使用lock锁

步骤:

1.在成员位置创建一个ReentrantLock对象

2.在可能出现线程安全代码前调用:ReentrantLock的lock()方法。

注:将可能出现线程安全代码放进try{}中

3.在finally{}中调用unlock()

     Lock r =  new ReentrantLock();//1.在成员位置创建一个ReentrantLock对象
   @Override
   public void run() {

       while(true){
          r.lock();
          try{
              if(tickets>0) {
                  System.out.println(Thread.currentThread().getName() + "-->" +"正在出售第"+tickets+"票");
                  tickets--;
                  }
            }
          finally {
              r.unlock();
              }

      }

 

原文地址:https://www.cnblogs.com/stydejava/p/13436748.html