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

时间:2017-02-17 06:28:29

标签: java multithreading concurrency 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();
       }
   }
}

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

sharedObject++;
lock.lock();
lock.unlock();

或者保证锁定不会被重新排序吗?

1 个答案:

答案 0 :(得分:7)

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

  

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

     

成功的锁定操作具有相同的内存同步   效果作为一个成功的锁定动作。

     

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

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