Thread.holdsLock()和锁定粗化

时间:2016-06-14 12:47:25

标签: java multithreading concurrency

假设我有2个相邻的synchronized块,并且之间有Thread.holdsLock()个来电话:

final Object lock = new Object();
// ...
synchronized (lock) {
    // do stuff
}
if (Thread.holdsLock(lock)) {
    throw new IllegalStateException();
}
synchronized (lock) {
    // do more stuff
}

现在,如果在某些时候JVM决定coarsen锁定并合并上述synchronized块,该怎么办? Thread.holdsLock()调用仍会返回false,还是代码会因异常而失败?

1 个答案:

答案 0 :(得分:6)

一个好问题,我会根据JSR 133 Cookbook说不。网格显示NormalLoad无法在MonitorExit上方重新排序。在这种情况下,从理论上讲,读取将是锁定。

此外,Rafael Winterhalter在presentation regarding the Java memory model中提到本地电话无法重新排序,但我无法找到证明这一点的文件。