Lock是否保证发生之前的关系?

Ryu*_*Ryu 12 java concurrency multithreading thread-safety java.util.concurrent

我对Java中的代码重新排序和竞争条件有疑问.

假设我有以下代码,同时执行两个或多个线程workForThread():

public class Job {
   private Lock lock = new ReentrantLock();
   private int sharedObject = 1;
   public void workForThread() {
       lock.lock();
       try {
           sharedObject++;
       } finally {
           lock.unlock();
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

JVM是否可能以错误的顺序执行此操作?例如,以下重新排序是否可能?:

sharedObject++;
lock.lock();
lock.unlock();
Run Code Online (Sandbox Code Playgroud)

或者是否保证锁不会被重新排序?

CKi*_*ing 7

让我们来看看Java Docs关于Lock界面的内容:

所有Lock实现必须强制执行与内置监视器锁提供的内存同步语义相同的内存同步语义,如Java™语言规范的第17.4节所述:

成功的锁定操作具有与成功锁定操作相同的内存同步效果.

成功解锁操作具有与成功解锁操作相同的内存同步效果.

所以你的问题的答案是肯定的.Lock为您提供与常规synchronized块/方法相同的重新排序保证.