簡體   English   中英

Lock 是否保證發生之前的關系?

[英]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 Docs關於Lock接口的內容:

所有Lock實現必須強制執行與內置監視器鎖提供的內存同步語義相同的內存同步語義,如Java™語言規范的第17.4節所述:

成功的鎖定操作具有與成功鎖定操作相同的內存同步效果。

成功解鎖操作具有與成功解鎖操作相同的內存同步效果。

所以你的問題的答案是肯定的。 Lock為您提供與常規synchronized塊/方法相同的重新排序保證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM