admin管理员组

文章数量:1530517

2023年12月13日发(作者:)

javaacquire_java相关:详解tryAcquire()、

addWaiter()。。。

java相关:详解tryAcquire()、addWaiter()、acquireQueued()

发布于 2020-5-23|

复制链接

摘记: 本文实例为大家分享了tryAcquire()、addWaiter()、acquireQueued()的用法 ,供大家参考,具体内容如下

tryAcquire()

```java

final boolean nonfa ..

本文实例为大家分享了tryAcquire()、addWaiter()、acquireQueued()的用法 ,供大家参考,具体内容如下tryAcquire()

```java

final boolean nonfairTryAcquire(int acquires) {

final Thread current = tThread();

int c = getState();

if (c == 0) {

if (compareAndSetState(0, acquires)) {

setExclusiveOwnerThread(current);

return true;

}

}

else if (current == getExclusiveOwnerThread()) {

int nextc = c + acquires;

if (nextc 先判断state是否为0,如果为0就执行上面提到的lock方法的前半部分,通过CAS操作将state的值从0变为1,否则判断当前线程

是否为exclusiveOwnerThread,然后把state++,也就是重入锁的体现,我们注意前半部分是通过CAS来保证同步,后半部分并没有同步

的体现,原因是:后半部分是线程重入,再次获得锁时才触发的操作,此时当前线程拥有锁,所以对ReentrantLock的属性操作是无需加锁

的。如果tryAcquire()获取失败,则要执行addWaiter()向等待队列中添加一个独占模式的节点。

addWaiter()

```java

/**

* Creates and enqueues node for current thread and given mode.

*

* @param mode IVE for exclusive, for shared

* @return the new node

*/private Node addWaiter(Node mode) {

Node node = new Node(tThread(), mode);

// Try the fast path of enq; backup to full enq on failure

Node pred = tail;

if (pred != null) {

= pred;

if (compareAndSetTail(pred, node)) {

= node;

return node;

}

}

enq(node);

return node;

}

```

这个方法的注释:创建一个入队node为当前线程,IVE 是独占锁, 是共享锁。

先找到等待队列的tail节点pred,如果pred!=null,就把当前线程添加到pred后面进入等待队列,如果不存在tail节点执行enq()

```java

private Node enq(final Node node) {

for (;;) {

Node t = tail;

if (t == null) { // Must initialize

if (compareAndSetHead(new Node()))

tail = head;

} else {

= t;

if (compareAndSetTail(t, node)) {

= node;

return t;

}

}

}

}

```这里进行了循环,如果此时存在了tail就执行同上一步骤的添加队尾操作,如果依然不存在,就把当前线程作为head结点。

插入节点后,调用acquireQueued()进行阻塞acquireQueued()

```py

final boolean acquireQueued(final Node node, int arg) {

boolean failed = true;

try {

boolean interrupted = false;

for (;;) {

final Node p = essor();

if (p == head && tryAcquire(arg)) {

setHead(node);

= null; // help GC

failed = false;

return interrupted;

}

if (shouldParkAfterFailedAcquire(p, node) &&

parkAndCheckInterrupt())

interrupted = true;

}

} finally {

if (failed)

cancelAcquire(node);

}

}

```

本文标签: 线程大家操作添加队列