简单聊聊AQS,AbstractQueuedSynchronize
你们知道并发的baba的谁吗?
生前不识Doug Lea,并发学了也枉然!
Java并发编程核心在于java.concurrent.util这个包,围绕着许多并发处理工具,其中,绕不开AbstractQueuedSynchronize。
AQS特性
我们需要重点关注下面几个点
1.AQS内部维护state,表示资源的可用状态
private volatile int state;
state三种访问方式
getState()
setState()
compareAndSetSate()
2.AQS定义两种资源共享方式
Exclusive-独占:只有一个线程能执行,如ReentrantLock
tryAcquire(int):独占方式。尝试获取资源,成功则返回true,失败则返回 false。
tryRelease(int):独占方式。尝试释放资源,成功则返回true,失败则返回 false。
Share-共享:多个线程可以同时共享执行,如Semaphore/CountDownLatch
tryAcquireShared(int):共享方式。尝试获取资源。负数表示失败;0表示成 功,但没有剩余可用资源;正数表示成功,且有剩余资源。
tryReleaseShared(int):共享方式。尝试释放资源,如果释放后允许唤醒后续 等待结点返回true,否则返回false。
3.AQS定义两种队列
同步等待队列
AQS当中的同步等待队列也称CLH队列,CLH队列是Craig、Landin、Hagersten三人
发明的一种基于双向链表数据结构的队列,是FIFO先入先出线程等待队列,Java中的CLH 队列是原CLH队列的一个变种,线程由原自旋机制改为阻塞机制。
条件等待队列
Condition是一个多线程间协调通信的工具类,使得某个,或者某些线程一起等待某个
条件(Condition),只有当该条件具备时,这些等待线程才会被唤醒,从而重新争夺锁
4.AQS定义两种模式
公平模式
非公平模式(默认)
public ReentrantLock() {
sync = new NonfairSync();
}
每个具体工具类都内部定义了一个Sync的内部类,该类继承AbstractQueuedSynchronized
abstract static class Sync extends AbstractQueuedSynchronizer
并且Sync还定义了两个子类
1、FairSync 公平锁的实现
2、NonfairSync 非公平锁的实现
static final class NonfairSync extends Sync
static final class FairSync extends Sync
上面主要涉及的设计模式:模板模式-子类根据需要做具体业务实现。
最后,同于synchronized的可重入
? 不同与synchronized的是允许中断
关于详解synchronized的链接准备好了详解synchronized
后面会重点出一篇源码详解关于AQS!!!
|