Bas*_*ass 7 java concurrency multithreading
假设我有两个相邻的synchronized块,Thread.holdsLock()它们之间有一个调用:
final Object lock = new Object();
// ...
synchronized (lock) {
// do stuff
}
if (Thread.holdsLock(lock)) {
throw new IllegalStateException();
}
synchronized (lock) {
// do more stuff
}
Run Code Online (Sandbox Code Playgroud)
现在,如果在某些时候JVM决定粗化锁并合并上面的synchronized块呢?将Thread.holdsLock()调用仍然返回false,或者代码是否会因异常而失败?
一个很好的问题,我会根据JSR 133 Cookbook说不.网格显示a NormalLoad不能重新排序MonitorExit.在这种情况下,理论上读取将是锁.
此外,Rafael Winterhalter在关于Java内存模型的演示文稿中提到本机调用无法重新排序,但我无法找到文档来证明这一点.