第6章 Java并发包中锁原理剖析

157 阅读1分钟

参考:

抽象同步队列AQS概述

AQS——锁的底层支持

AbstractQueuedSynchronizer抽象同步队列简称AQS,是实现同步器的基础组件。

以下为AQS的类结构图:

AQS是一个FIFO的双向队列,内部通过head和tail两个节点来对队列进行维护。

Node是AQS的一个静态内部类,属性SHARED和EXCLUSIVE分别代表用来标识线程是获取共享资源和独占资源时被阻塞挂起放入AQS队列的。thread为Node持有的Thread;waitStatus用于记录当前线程的状态,CANCELLED表示线程被取消,SIGNAL表示线程需要唤醒,CONDITION表示线程在条件队列里面等待,PROPAGATE表示释放共享资源时需要通知其他节点。

AQS维护了一个单一的状态信息state,可以通过getState、setState、compareAndSetState函数修改其值。

AQS内部类ConditionObject用来结合锁实现线程同步。

AQS实现线程同步的关键是对state进行操作,根据state是否属于一个线程,操作state的方式可分为独占方式和共享方式。

独占方式下获取和释放资源的方法为: