假设我有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
,还是代码会因异常而失败?
答案 0 :(得分:6)
一个好问题,我会根据JSR 133 Cookbook说不。网格显示NormalLoad
无法在MonitorExit
上方重新排序。在这种情况下,从理论上讲,读取将是锁定。
此外,Rafael Winterhalter在presentation regarding the Java memory model中提到本地电话无法重新排序,但我无法找到证明这一点的文件。