并发包锁结构
Lock
Lock是一个接口,定义了锁获取和释放的基本操作。
AbstractQueuedSynchronizer
队列同步器,是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。
同步器是实现锁的关键,在锁的实现中聚和同步器,利用同步器实现锁的语义。锁是面向使用者的,它定义了使用者与锁交互的接口,隐藏了实现细节;同步器面向的是锁的实现者,它简化了锁的实现方式,屏蔽了同步状态管理、线程的排队、等待与唤醒等底层操作。
队列同步器方法
- 同步器同步状态访问和修改的方法
- 同步器可重写的方法
- 同步器模板方法
同步队列
节点数据结构
节点是构成同步队列(等待队列)的基础,同步器拥有首节点和尾节点,没有成功获取同步状态的线程将会成为节点加入到该队列的尾部。
- 独占式同步状态获取
主要完成同步状态获取、节点构造、加入同步队列、在同步队列自旋。
- 独占式同步状态释放
整个过程总结:在获取同步状态时,同步器维护一个同步队列,获取状态失败的线程都会被加入到队列中并在队列中进行自旋;移出队列(停止自旋)的条件是前驱节点为头节点且成功获取了同步状态。在释放同步状态时,同步器调用tryRelease方法释放同步状态,然后唤醒头节点的后继节点。
ReentrantLock
- 可重入
- 公平不公平
参考
《Java 并发编程的艺术》