并发包之锁

并发包锁结构

lock包结构

Lock

Lock是一个接口,定义了锁获取和释放的基本操作。

lock-api

AbstractQueuedSynchronizer

队列同步器,是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。
同步器是实现锁的关键,在锁的实现中聚和同步器,利用同步器实现锁的语义。锁是面向使用者的,它定义了使用者与锁交互的接口,隐藏了实现细节;同步器面向的是锁的实现者,它简化了锁的实现方式,屏蔽了同步状态管理、线程的排队、等待与唤醒等底层操作。

同步状态
等待队列

队列同步器方法

  • 同步器同步状态访问和修改的方法
同步状态
  • 同步器可重写的方法
可重写方法
  • 同步器模板方法
模版方法

同步队列

节点数据结构

node数据结构

节点是构成同步队列(等待队列)的基础,同步器拥有首节点和尾节点,没有成功获取同步状态的线程将会成为节点加入到该队列的尾部。

  • 独占式同步状态获取
独占获取

主要完成同步状态获取、节点构造、加入同步队列、在同步队列自旋。

  • 独占式同步状态释放
独占释放

整个过程总结:在获取同步状态时,同步器维护一个同步队列,获取状态失败的线程都会被加入到队列中并在队列中进行自旋;移出队列(停止自旋)的条件是前驱节点为头节点且成功获取了同步状态。在释放同步状态时,同步器调用tryRelease方法释放同步状态,然后唤醒头节点的后继节点。

ReentrantLock

  • 可重入
  • 公平不公平

参考

《Java 并发编程的艺术》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容