Java高并发高性能编程(多线程,协程,Actor,RxJava、Akka、Reactor)

AbstractQueuedSynchronizer

2019-06-22  本文已影响0人  那谁319

AQS简介

什么是AQS(抽象队列同步器)

1、同步器是用来构建锁和其他同步组件的基础框架,它的实现主要依赖一个int
成员变量来表示同步状态以及通过一个FIFO队列构成等待队列。它的子类必须重
写AQS的几个protected修饰的用来改变同步状态的方法,其他方法主要是实现了
排队和阻塞机制。状态的更新使用getState,setState以及compareAndSetState这
三个方法。
2、子类被推荐定义为自定义同步组件的静态内部类,同步器自身没有实现任何
同步接口,它仅仅是定义了若干同步状态的获取和释放方法来供自定义同步组件
的使用,同步器既支持独占式获取同步状态,也可以支持共享式获取同步状态,
这样就可以方便的实现不同类型的同步组件。

acquire方法执行逻辑(独占锁的获取)

image.png

addWaiter方法执行逻辑(添加等待线程)

image.png

enq方法执行逻辑

image.png

以上完成了等待线程构建成Node节点对象,添加到等待链式列表的逻辑,但是这个等待线程怎样才能让自己获取独占锁呢?

acquireQueued方法执行逻辑

image.png

shouldParkAfterFailedAcquire方法执行逻辑

image.png

parkAndCheckInterrupt方法执行逻辑

image.png

所以,acquireQueued方法在自旋过程中主要完成了两件事情:

1、如果当前节点的前驱节点是头节点,并且当前线程能够获得锁,则该方法执行结束退出;
2、获取锁失败的话,先将当前节点的前驱节点状态设置成SIGNAL,然后调用LookSupport.park方法使得当前线程阻塞。

独占式锁的获取过程也就是acquire()方法的执行流程借用网上的一张图如下图所示:


image.png

release()方法执行逻辑(独占锁的释放)

image.png

unparkSuccessor方法执行逻辑

image.png

可中断式获取锁(acquireInterruptibly方法)

image.png

doAcquireInterruptibly方法执行逻辑

image.png

超时等待式获取锁(tryAcquireNanos()方法)

image.png

doAcquireNanos方法执行逻辑

image.png

共享锁的获取(acquireShared()方法)

image.png

doAcquireShared方法执行逻辑

image.png

可中断共享锁的获取(acquireSharedInterruptibly()方法)

超时等待共享锁的获取(tryAcquireSharedNanos()方法)

上一篇 下一篇

猜你喜欢

热点阅读