java使用aqs自定义并发容器_java AQS(AbstractQueuedSynchronizer)同步器详解

static final classNode {/**Marker to indicate a node is waiting in shared mode*/

//非独占

static final Node SHARED = newNode();/**Marker to indicate a node is waiting in exclusive mode*/

//独占

static final Node EXCLUSIVE = null;/**waitStatus value to indicate thread has cancelled*/

//线程已取消

static final int CANCELLED = 1;/**waitStatus value to indicate successor's thread needs unparking*/

//后续节点线程需要调度

static final int SIGNAL = -1;/**waitStatus value to indicate thread is waiting on condition*/

//线程等待某一条件

static final int CONDITION = -2;/*** waitStatus value to indicate the next acquireShared should

* unconditionally propagate*/

//下次acquireShared无条件传递

static final int PROPAGATE = -3;/*** Status field, taking on only the values:

* SIGNAL: The successor of this node is (or will soon be)

* blocked (via park), so the current node must

* unpark its successor when it releases or

* cancels. To avoid races, acquire methods must

* first indicate they need a signal,

* then retry the atomic acquire, and then,

* on failure, block.

* CANCELLED: This node is cancelled due to timeout or interrupt.

* Nodes never leave this state. In particular,

* a thread with cancelled node never again blocks.

* CONDITION: This node is currently on a condition queue.

* It will not be used as a sync queue node

* until transferred, at which time the status

* will be set to 0. (Use of this value here has

* nothing to do with the other uses of the

* field, but simplifies mechanics.)

* PROPAGATE: A releaseShared should be propagated to other

* nodes. This is set (for head node only) in

* doReleaseShared to ensure propagation

* continues, even if other operations have

* since intervened.

* 0: None of the above

*

* The values are arranged numerically to simplify use.

* Non-negative values mean that a node doesn't need to

* signal. So, most code doesn't need to check for particular

* values, just for sign.

*

* The field is initialized to 0 for normal sync nodes, and

* CONDITION for condition nodes. It is modified using CAS

* (or when possible, unconditional volatile writes).*/

volatile intwaitStatus;/*** Link to predecessor node that current node/thread relies on

* for checking waitStatus. Assigned during enqueing, and nulled

* out (for sake of GC) only upon dequeuing. Also, upon

* cancellation of a predecessor, we short-circuit while

* finding a non-cancelled one, which will always exist

* because the head node is never cancelled: A node becomes

* head only as a result of successful acquire. A

* cancelled thread never succeeds in acquiring, and a thread only

* cancels itself, not any other node.*/

volatileNode prev;/*** Link to the successor node that the current node/thread

* unparks upon release. Assigned during enqueuing, adjusted

* when bypassing cancelled predecessors, and nulled out (for

* sake of GC) when dequeued. The enq operation does not

* assign next field of a predecessor until after attachment,

* so seeing a null next field does not necessarily mean that

* node is at end of queue. However, if a next field appears

* to be null, we can scan prev's from the tail to

* double-check. The next field of cancelled nodes is set to

* point to the node itself instead of null, to make life

* easier for isOnSyncQueue.*/

volatileNode next;/*** The thread that enqueued this node. Initialized on

* construction and nulled out after use.*/

volatileThread thread;/*** Link to next node waiting on condition, or the special

* value SHARED. Because condition queues are accessed only

* when holding in exclusive mode, we just need a simple

* linked queue to hold nodes while they are waiting on

* conditions. They are then transferred to the queue to

* re-acquire. And because conditions can only be exclusive,

* we save a field by using special value to indicate shared

* mode.*/Node nextWaiter;/*** Returns true if node is waiting in shared mode*/

final booleanisShared() {return nextWaiter ==SHARED;

}/*** Returns previous node, or throws NullPointerException if null.

* Use when predecessor cannot be null. The null check could

* be elided, but is present to help the VM.

*

*@returnthe predecessor of this node*/

final Node predecessor() throwsNullPointerException {

Node p=prev;if (p == null)throw newNullPointerException();else

returnp;

}

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;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值