3、AQS
上文我们较为详细的介绍了Java线程调度中的Object
Monitor机制以及其工作情况,本文我们开始介绍Java线程调度中的另一种实现机制AQS,包括它的使用方式和底层工作原理。
3.1、AQS介绍
”技术的封装。
同步多线程(SMT)
技术是一种硬件层面的技术,具体来说是直接由CPU提供的技术实现。而Java语言中,使用了sun.misc.Unsafe类完成了对这个技术的调用封装。一旦使用Unsafe中的park调用,则当我们使用jstack查看可能的线程阻塞状态时,就会看到类似WATING(parking)这个的提示信息。
接着AQS队列的实现还直接依赖于java中的sun.misc.Unsafe类,这个类在本专题之前的文章中也同样介绍过——它是Java语言中实现乐观锁CAS技术的基础,其底层完全依赖于java本地方法JNI完成操作系统级别的调用。另外。如果读者自己观察源代码就会发现,实际上LockSupport类依赖的底层类也是sun.misc.Unsafe,所以Java中ASQ队列技术的整个依赖关系可以如下图所示:
3.2、AQS的主要概念和使用方式
3.2.1、AbstractQueuedSynchronizer中的主要概念
要使用好AbstractQueuedSynchronizer,就需要了解AbstractQueuedSynchronizer中几个关键概念。
AbstractQueuedSynchronizer中的state状态:
上文已经提到AbstractQueuedSynchronizer的抽象类中保持了一个任务队列,并且在AbstractQueuedSynchronizer中使用了一个“private
volatile int
state;”变量,协调这个队列中各个节点的调度(下文会详细讲述如何进行协调)。AbstractQueuedSynchronizer中取得或者设置state状态的方法包括getState()、setState()和compareAndSetState()。注意:AQS队列的state状态初始化值为0。