当我在我的一个项目中使用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
,它在多线程环境中如何运作?
答案 0 :(得分:0)
如何设置锁定而不阻塞?
总是获得锁定。这就是重点:当lock.tryLock()
阻止来电者时,lock.lock()
可能会失败。
它不使用同步块或函数
那会破坏目的。由于任何原因,不要阻止。
我不熟悉该代码,但看起来实际上是在compareAndSetState(0, acquires)
中获取(或不是)锁。可能在它的核心某处有Compare and Set硬件指令。
FWIW,AtomicInteger.compareAndSet(...)功能非常相似。