作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图了解ReentrantLock::lock
方法中的特定细节。我正在查看它,并看到它是:
final void lock() {
if (!initialTryLock()) {
acquire(1);
}
}
因此,首先尝试使用以下方法:
initialTryLock
(我将在
NonfairSync
中查看),该方法将执行以下操作:
compareAndSwap(0, 1)
,这意味着如果没有人握住该锁(0
)并且我可以捕获它(1
),则现在握住该锁。 false
,这意味着我无法获取锁。 acquire
中调用
AbstractQueuedSynchronizer
:
public final void acquire(int arg) {
if (!tryAcquire(arg))
acquire(null, arg, false, false, false, 0L);
}
它首先在
tryAcquire
中调用
NonfairSync
:
protected final boolean tryAcquire(int acquires) {
if (getState() == 0 && compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(Thread.currentThread());
return true;
}
return false;
}
您可以看到,尽管
initialTryLock
已经失败,但它尝试再次获取锁。从理论上讲,这个
tryAcquire
可以简单地返回
false
,对吗?
initialTryLock
和
tryAcquire
的调用之间,该锁可能已被释放。这样做的好处可能是因为下一个操作(在
tryAcquire
之后)失败了,因此该线程的排队费用很高。因此,我想这样(重试)是有道理的吗?
最佳答案
只是添加到the answer above。
tryAcquire
could have simply returned false, right?
boolean tryAcquire(int acquires) {
return false;
}
会破坏
AbstractQueuedSynchronizer
的工作。
tryAcquire()
是获取
AbstractQueuedSynchronizer
的唯一方法。
acquire()
in the end uses tryAcquire()
。
tryAcquire()
始终返回
false
,则
acquire()
将永远不会获得锁定。
acquire()
。
关于java - 重入锁实现细节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65928109/
嗨,我已经阅读了 Java 中的 ReadWriteLock,但我不确定我是否掌握了它的重入部分。这是两个仅使用一个主线程来显示重入的简短代码示例 public class Locks { p
我在使用 NotifyIcons 时发现了一个重入问题。重现它真的很容易,只需在表单上放置一个 NotiftIcon,点击事件应该如下所示: private bool reentrancyDetect
我正在尝试使用 SQLite 的新 C 接口(interface)预更新 Hook : https://www.sqlite.org/c3ref/preupdate_count.html 现在回答我的
来自阅读here我发现 Actor 是可重入的,并且我希望以下情况成立:如果我有单一类型的转换 ThespianType 但有三个特定的 Actor ThespianType (T1、T2 和 T3)
有人可以向我解释一下 BlockReentrancy 的目的是什么吗?方法在ObservableCollection ? MSDN显示以下内容作为示例: //The typical usage is
我是一名优秀的程序员,十分优秀!