[英]How does ReentrantLock.tryLock() works as it seems from source code that it does not use synchronized block or function
就像我在一个项目中使用tryLock()
方法一样,同时使用相同的问题时,引人注意的问题是tryLock()
被称为非阻塞机制,它如何设法在不阻塞的情况下获得锁定。
可能有两种情况
synchronized
块/方法,那么问题是,它如何在多线程环境中工作 synchronized
阻塞/方法,那么问题是,它如何非阻塞 为了找到答案,我检查了tryLock
的以下代码
public boolean tryLock() {
return sync.nonfairTryAcquire(1);
}
这是sync.nonfairTryAcquire(1)
的代码,它实际上完成了工作
final boolean nonfairTryAcquire(int acquires) {
final Thread current = Thread.currentThread();
int c = getState();
if (c == 0) {
if (compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;
}
}
else if (current == getExclusiveOwnerThread()) {
int nextc = c + acquires;
if (nextc < 0) // overflow
throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;
}
似乎tryLock()
的代码未在任何地方使用synchronized
, 它如何在多线程环境中工作?
它如何设法获得锁而不阻塞?
它并不总是能锁住。 重点lock.tryLock()
:当lock.lock()
阻止了调用者时, lock.lock()
可能失败。
它不使用同步块或功能
那会破坏目的。 重点不是出于任何原因进行阻止。
我不熟悉该代码,但看起来好像是在compareAndSetState(0, acquires)
)中实际获取(或不compareAndSetState(0, acquires)
该锁。 可能在其中心某处有“ 比较并设置”硬件指令。
FWIW, AtomicInteger.compareAndSet(...)函数的作用非常相似。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.