Lock

ReentrantLock(可重入锁)类实现了Lock,它拥有与synchronized 相同的并发性和内存语义,在实现线程安全的控制中,比较常用的是ReentrantLock。可以显示加锁、释放锁。

package gaoji;

import java.util.concurrent.locks.ReentrantLock;

//测试lock锁
public class TestLock {
   public static void main(String[] args) {
       TestLock2 testLock2=new TestLock2();
       new Thread(testLock2).start();
       new Thread(testLock2).start();
       new Thread(testLock2).start();
  }
}
class  TestLock2 implements Runnable{
   int ticketNums=10;

   //定义lock锁
   private final ReentrantLock lock=new ReentrantLock();


   @Override
   public void run() {
       while (true){

           try{
               lock.lock();//加锁

               if(ticketNums>0){
                   try {
                       Thread.sleep(1000);
                  } catch (InterruptedException e) {
                       e.printStackTrace();
                  }
                   System.out.println(ticketNums--);
              }else {
                   break;
              }
          }finally {
               //解锁
               lock.unlock();
          }

      }
  }
}

synchronized与Lock的对比

Lock是显示锁(手动开启和关闭,别忘记关闭锁)synchronized是隐式锁,出了作用域自动释放。

Lock只有代码块锁,synchronized有代码块锁和方法锁。

使用Lock锁,JVM将花费较少的时间来调度线程,性能更好。并且具有更好的扩展性(提供更多的子类)。

优先使用顺序:

Lock > 同步代码块(已经进入方法体,分配了相应资源) > 同步方法(在方法体之外)

21.线程协作

posted @ 2021-07-29 09:12  清钦  阅读(186)  评论(0)    收藏  举报