并发编程--AbstractQueuedSynchronizer介绍和原理分析
Posted 归田
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发编程--AbstractQueuedSynchronizer介绍和原理分析相关的知识,希望对你有一定的参考价值。
AbstractQueuedSynchronizer是并发编程包中最重要的类,是并发编程包的实现基层。简单来说,AbstractQueuedSynchronizer提供了一个基于FIFO的队列,用于存储处于阻塞状态的线程;提供了一个volatile修改的state变量,用于作为锁获取的标识位,对于FIFO队列和state的操作都是通过Unsafe这个类来实现CAS原子操作。
AQS的功能可以分为两类:独占功能和共享功能,它的所有子类中,要么实现了并使用了它独占锁功能的API,要么使用了共享锁的功能,而不会同时使用两套API,即便是它最有名的子类读写锁ReentrantReadWriteLock也是通过两个内部类:读锁和写锁,分别实现两套API来实现的。
一、FIFO队列:
//阻塞线程节点
static final class Node {
static final Node SHARED = new Node(); //共享锁
static final Node EXCLUSIVE = null; //独占锁
static final int CANCELLED = 1; //用于表示当前线程被取消
static final int SIGNAL = -1; //表示当前线程处于阻塞状态
static final int CONDITION = -2; //表示当前节点在等待Condition
static final int PROPAGATE = -3; //表示当前场景下后续的acquireShared能够得以执行
volatile int waitStatus;
volatile Node prev;
volatile Node next;
volatile Thread thread;
Node nextWaiter;
}
当线程没有竞争到锁资源时就会被阻塞并放到FIFO队列中,当锁资源释放后再从FIFO由阻塞状态变为可执行状态来获取锁资源并执行。当线程获取锁资源时有公平锁和非公平锁可以参考
并发编程--公平锁和非公平锁;此外对于锁的分类还有独占锁和共享锁,简单来说独占锁state就是当前锁只能有一个线程获取,其他线程处于阻塞状态,共享锁是多个线程可以同时持有当前锁状态state,只要符合某种要求所有线程可以并发执行,不用进行阻塞等待。
AQS FIFO队列模型:
以上是关于并发编程--AbstractQueuedSynchronizer介绍和原理分析的主要内容,如果未能解决你的问题,请参考以下文章