Skip to the content.

首页

version: jdk17


AQS

抽象队列同步器,是一个用于构建同步器的框架,底层使用了一个先进先出的同步队列和一个int类型的状态。为模板方法设计模式,提供了一系列方法用于获取和释放同步状态,子类需要实现tryAcquire、tryAcquireShared、tryRelease、tryReleaseShared、isHeldExclusively方法。

state

volatile的,资源的标识,使用该变量的值来表示同步器的状态,定义了compareAndSetState方法对其进行CAS更新。

Node

同步队列,为先进先出的双端队列,分为独享模式和共享模式,独享模式只允许一个线程获取到资源,而共享模式允许多个。

获取和释放资源

JDK14之前

JDK14

区别

JDK14之前,通过头节点的waitStatus判断是否需要阻塞,而JDK14之后不需要判断头节点的status,同时独占和共享模式的实现被集成到了一起。

ConditionObject(TODO)

Condition接口的唯一实现类(AQLS的ConditionObject除外)。

原子操作

JDK8使用Unsafe类(sun.misc),JDK9改为使用VarHandle类,JDK14重新使用Unsafe类(jdk.internal.misc)。

JDK14:We use jdk.internal Unsafe versions of atomic access methods rather than VarHandles to avoid potential VM bootstrap issues.


Lock & ReadWriteLock & Condition


ReentrantLock

可重入的排他锁,支持公平和非公平方式,默认非公平,基于继承内部类Sync实现。

Sync

抽象类,继承自AQS,子类为NonfairSync和FairSync。


ReentrantReadWriteLock

可重入的读写锁,支持公平和非公平方式,默认也是非公平。写锁为独占模式,读锁为共享模式,读锁被持有时无法获取写锁,但同一个线程获取了写锁可以继续获取读锁(即支持锁降级,锁升级会导致死锁),可能出现‘写饥饿’现象

ReadLock & WriteLock

读锁和写锁,使用ReentrantReadWriteLock的Sync实现,读锁使用共享模式,无法创建Condition,写锁使用排他模式,可以创建Condition。

Sync

抽象类,继承自AQS,子类为NonfairSync和FairSync。

属性

自身方法

AQS方法实现


StampedLock

非可重入,读写锁,JDK8新增,未实现Lock接口,未使用AQS实现,适用于读多写少的场景,能避免写饥饿现象,支持写锁,悲观读锁、乐观读锁以及锁互相转换

属性

方法

公共API


Semaphore

信号量,支持公平和非公平方式,创建时需要指定资源总数permits。

Sync

抽象类,继承自AQS,使用共享模式获取资源,permits是state的默认值。


CountDownLatch

闭锁,创建时需要指定count,调用await方法的线程等待,直到其他线程使用countDown方法将count减至0后才继续执行,只能使用一次,count无法重置。

Sync

继承自AQS,使用共享模式获取资源,count是state的默认值。

方法


CyclicBarrier

循环栅栏,基于ReentrantLock和Condition的等待/通知模式实现,线程使用await方法后阻塞,直到await的次数达到parties值则唤醒所有线程,之后可以重置再次使用。


Phaser

移相器,升级的栅栏,还能能维护一个树状的层级关系,可以动态地控制每个阶段的任务总量,当任务总量减少为0时才会终止(onAdvance方法)。


Exchanger<V>

用于两个线程交换数据,可以视作双向的同步队列,可以重复使用。