aqs原理:是一个用于构建锁和同步器的框架,它能降低构建锁和同步器的工作量,还可以避免处理多个位置上发生的竞争问题,在基于AQS构建的同步器中,只可能在一个时刻发生阻塞,从而降低上下文切换的开销,并提高吞吐量。
本文环境:windows10系统、thinkpad t480电脑,该方法适用于所有品牌的电脑。
什么是AQS?
AQS即AbstractQueuedSynchronizer,是一个用于构建锁和同步器的框架。它能降低构建锁和同步器的工作量,还可以避免处理多个位置上发生的竞争问题。在基于AQS构建的同步器中,只可能在一个时刻发生阻塞,从而降低上下文切换的开销,并提高吞吐量。
AQS支持独占锁(exclusive)和共享锁(share)两种模式。
独占锁:只能被一个线程获取到(Reentrantlock)
共享锁:可以被多个线程同时获取(CountDownLatch,ReadWriteLock).
无论是独占锁还是共享锁,本质上都是对AQS内部的一个变量state的获取。state是一个原子的int变量,用来表示锁状态、资源数等。
AQS内部的数据结构与原理
AQS内部实现了两个队列,一个同步队列,一个条件队列。
同步队列的作用是:当线程获取资源失败之后,就进入同步队列的尾部保持自旋等待,不断判断自己是否是链表的头节点,如果是头节点,就不断参试获取资源,获取成功后则退出同步队列。
条件队列是为Lock实现的一个基础同步器,并且一个线程可能会有多个条件队列,只有在使用了Condition才会存在条件队列。
同步队列和条件队列都是由一个个Node组成的。AQS内部有一个静态内部类Node。
Copy static final class Node { static final Node EXCLUSIVE = null; //当前节点由于超时或中断被取消 static final int CANCELLED = 1; //表示当前节点的前节点被阻塞 static final int SIGNAL = -1; //当前节点在等待condition static final int CONDITION = -2; //状态需要向后传播 static final int PROPAGATE = -3; volatile int waitStatus; volatile Node prev; volatile Node next; volatile Thread thread; Node nextWaiter; final boolean isShared() { return nextWaiter == SHARED; } final Node predecessor() throws NullPointerException { Node p = prev; if (p == null) throw new NullPointerException(); else return p; } Node() { // Used to establish initial head or SHARED marker } Node(Thread thread, Node mode) { // Used by addWaiter this.nextWaiter = mode; this.thread = thread; } Node(Thread thread, int waitStatus) { // Used by Condition this.waitStatus = waitStatus; this.thread = thread; } }
以上就是aqs原理是什么的详细内容,更多请关注易知道|edz.cc其它相关文章!