讓我們考慮使用Java下列標準同步:Java - 鎖定保證如何在關係之前發生?
public class Job {
private Lock lock = new ReentrantLock();
public void work() {
lock.lock();
try {
doLotsOfWork();
} finally {
lock.unlock();
}
}
}
我理解的基礎上的Javadoc,這相當於塊。我很努力地看到這是如何在更低層次上實施的。
Lock
有一個易失性狀態,一旦調用lock()
它執行一個易失性讀取,然後在釋放後執行易失性寫入。一個對象的狀態寫如何確保,即沒有指令的doLotsOfWork
,這可能會觸及許多不同的對象,不會被亂序執行?
或者想象doLotsOfWork實際上是與1000+行代碼取代。很明顯,編譯器無法預先知道鎖內存在易失性,因此需要停止重新排序指令。那麼,如何保證lock/unlock
,即使它是圍繞單獨對象的易失性狀態構建的?
我沒有看到Lock/ReentrantLock實現中的任何volatile。您可以在以下網址查看ReentraltLock實施:http://grepcode.com/file_/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/locks/ReentrantLock.java/?v=來源 –
通過其實施。它沒有被定義。只需要。 – EJP
AbstractQueuedSYnchronizer的狀態是一個易變的變量 – Bober02