赞
踩
AQS即AbstractQueuedSynchronizer
,是一个用于构建锁和同步器的框架。它能降低构建锁和同步器的工作量,还可以避免处理多个位置上发生的竞争问题。在基于AQS构建的同步器中,只可能在一个时刻发生阻塞,从而降低上下文切换的开销,并提高吞吐量。
AQS支持独占锁(exclusive)和共享锁(share)两种模式。
无论是独占锁还是共享锁,本质上都是对AQS内部的一个变量state的获取。state是一个原子的int变量,用来表示锁状态、资源数等。
AQS内部实现了两个队列,一个同步队列,一个条件队列。
同步队列的作用是:当线程获取资源失败之后,就进入同步队列的尾部保持自旋等待,不断判断自己是否是链表的头节点,如果是头节点,就不断参试获取资源,获取成功后则退出同步队列。
条件队列是为Lock实现的一个基础同步器,并且一个线程可能会有多个条件队列,只有在使用了Condition才会存在条件队列。
同步队列和条件队列都是由一个个Node组成的。AQS内部有一个静态内部类Node
- 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;
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。