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);
}
}
```
版权声明:本文标题:javaacquire_java相关:详解tryAcquire()、addWaiter()。。。 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1702479574a9183.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论