重入锁ReentrantLock详解

重入锁ReentrantLock详解 

   ReentrantLock 实现自AQS队列同步器,其字面意思是可以重复进入的锁,其功能也如其名,在一个同步代码块中,可以多次调用 lock() 进行上锁,当然也需要对其进行多次解锁,才能使同步状态归0,其它线程才能重新获得锁。

  重入锁又分为非公平锁和公平锁两种实现,默认实现为非公平锁,要实现公平锁,在new对象时在构造参数中传入参数true即可。非公平锁上锁过程不会管先后顺序,谁先更新到同步状态谁就获得了锁。而公平锁会根据上锁的顺序,将线程放入队列中,依次执行。从效率上讲公平锁消耗更多资源,因为它要协调这种先后执行顺序。

一、非公平锁

  1.非公平锁上锁

   高清图被浏览器压缩了,有些变糊了。可以复制下载下来看。

  总结:

  (1)非公平重入锁首先尝试CAS更新同步状态,即抢锁;

  (2)抢锁失败会先调用非公平锁重写的tryAcquire方法,如果当前同步状态为0,那么也尝试CAS更新同步状态进行抢锁;

  (3)如果同步状态不为0,则判断是否是当前线程重复上锁

  (4)还是失败,则进入队列,在当前节点的前置节点为头节点时,开始尝试抢锁;

  (5)抢锁成功,完

二、非公平锁

  1.上锁

  代码的区别如下,就在hasQueuedPredecessors方法,此方法判断当前线程是否有前置的线程节点在等待,有则继续自旋或等待,没有则进行CAS更新同步状态抢锁

原文地址:https://www.cnblogs.com/lcmlyj/p/14010607.html