[英]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.