同步状态的获取与释放
独占式获取与释放同步状态
public final void acquire(int arg) {
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}private Node addWaiter(Node mode) {
Node node = new Node(Thread.currentThread(), mode);
// 尝试通过一次CAS操作将其加到队尾
Node pred = tail;
if (pred != null) {
node.prev = pred;
if (compareAndSetTail(pred, node)) {
pred.next = node;
return node;
}
}
//快速尝试不成功,则d调用enq(node)方法
enq(node);
return node;
}
private Node enq(final Node node) {
//通过死循环CAS操作,来确保节点被线程安全地添加到队尾
for (;;) {
Node t = tail;
if (t == null) { // 队列未初始化的情况
if (compareAndSetHead(new Node()))
tail = head;
} else {//正常情况
node.prev = t;
if (compareAndSetTail(t, node)) {
t.next = node;
return t;
}
}
}
}
共享式同步状态获取与释放
独占式超时获取同步状态
Last updated
