我对Java中的代码重新排序和竞争条件有疑问。
假设我有以下代码,有两个或多个线程同时执行workForThread()
:
public class Job {
private Lock lock = new ReentrantLock();
private int sharedObject = 1;
public void workForThread() {
lock.lock();
try {
sharedObject++;
} finally {
lock.unlock();
}
}
}
JVM是否可能以错误的顺序执行此操作?例如,以下重新排序是否可能?:
sharedObject++;
lock.lock();
lock.unlock();
或者保证锁定不会被重新排序吗?
答案 0 :(得分:7)
让我们看一下 Java Docs 关于Lock
界面的内容:
所有Lock实现必须强制执行相同的内存同步 由内置监视器锁提供的语义,如中所述 Java™语言规范的第17.4节:
成功的锁定操作具有相同的内存同步 效果作为一个成功的锁定动作。
成功的解锁操作有 与成功解锁操作相同的内存同步效果。
所以你的问题的答案是肯定的。 Lock
为您提供与常规synchronized
块/方法相同的重新排序保证。