Unsafe.compareAndSwapXXX 实现CAS更改 state 和 队列指针 内部依赖CPU提供的原子指令
可见性与有序性
volatile 修饰 state 与 队列指针 (prev/next/head/tail)
线程阻塞与唤醒
Unsafe.park Unsafe.parkNanos Unsafe.unpark
Unsafe类是在sun.misc包下,不属于Java标准。提供了内存管理、对象实例化、数组操作、CAS操作、线程挂起与恢复等功能,Unsafe类提升了Java运行效率,增强了Java语言底层的操作能力。很多Java的基础类库,包括一些被广泛使用的高性能开发库都是基于Unsafe类开发的,比如Netty、Cassandra、Hadoop、Kafka等
AQS内部有两种模式:独占模式和共享模式
AQS 的设计是基于模板方法的,使用者需要继承 AQS 并重写指定的方法。不同的自定义同步器争用共享资源的方式不同,比如可重入、公平性等都是子类来实现。
自定义同步器在实现时只需要实现共享资源state的获取与释放方式即可,至于具体线程等待队列的维护(如获取资源失败入队/唤醒出队等),由AQS内部处理。
独占模式
只有一个线程都能够获取到锁
锁释放后需要唤醒后继节点
AQS提供的独占模式相关的方法
// 获取独占锁(线程阻塞直至获取成功)
public final void acquire(int)
// 获取独占锁,可被中断
public final void acquireInterruptibly(int)
// 获取独占锁,可被中断 和 指定超时时间
public final boolean tryAcquireNanos(int, long)
// 释放独占锁(释放锁后,将等待队列中第一个等待节点唤醒 )
public final boolean release(int)