Lock 是否保证 happens-before 关系?
Does Lock guarantee a happens-before relationship?
我对 Java 中的代码重新排序和竞争条件有疑问。
假设我有以下代码,有 2 个或更多线程同时执行 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();
或者保证锁不会被重新排序?
让我们看看 Java 文档 对 Lock
界面的描述:
All Lock implementations must enforce the same memory synchronization
semantics as provided by the built-in monitor lock, as described in
section 17.4 of The Java™ Language Specification:
A successful lock operation has the same memory synchronization
effects as a successful Lock action.
A successful unlock operation has
the same memory synchronization effects as a successful Unlock action.
所以你的问题的答案是肯定的。 Lock
为您提供与常规 synchronized
block/method 相同的重新排序保证。
我对 Java 中的代码重新排序和竞争条件有疑问。
假设我有以下代码,有 2 个或更多线程同时执行 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();
或者保证锁不会被重新排序?
让我们看看 Java 文档 对 Lock
界面的描述:
All Lock implementations must enforce the same memory synchronization semantics as provided by the built-in monitor lock, as described in section 17.4 of The Java™ Language Specification:
A successful lock operation has the same memory synchronization effects as a successful Lock action.
A successful unlock operation has the same memory synchronization effects as a successful Unlock action.
所以你的问题的答案是肯定的。 Lock
为您提供与常规 synchronized
block/method 相同的重新排序保证。