之前写了篇文章介绍了synchronized的原理《》,而本篇是介绍另外一个高频的出现在并发场景的类ReentrantLock,有必要深入理解他的使用和原理。

使用

与synchronized的异同

  1. 可重入锁
  2. 可响应中断
  3. 可尝试加锁
  4. 限时等待尝试加锁
  5. 公平锁、非公平锁

原理

看下ReentrantLock的源码,其中有个重要的变量sync,是一个继承AbstractQueuedSynchronizer (以下称为AQS) 的Sync抽象类,分别由FairSync、NonfairSync类实现,代表着公平和非公平策略。

\"继承关系\"

可见,ReentrantLock的实现基本依靠AQS实现的,所以如果要理解ReentranLock,有必要学习AQS。

AQS(AbstractQueuedSynchronizer)

AQS 基本数据结构是一个FIFO的双向队列,每个结点Node存储线程和其他信息。队列的头部表示该结点对应的线程已经在执行了,占用了资源。

\"FIFO\"

AQS 有两种模式,一种是独占锁,表示只有一个线程能执行,另外一种是共享锁,表示可以多个线程同时执行。ReentrantLock是独占锁。

\"在这里插入图片描述\"

Condition

公平锁

非公平锁

收藏 打印