我知道的ReentrantLock使用的AbstractQueuedSynchronizer(AQS)實施鎖定。 但是實現的細節,我無法理解。Java併發:ReentrantLock是一個錯誤的設計?
我知道AQS使用volatile,CAS和旋轉同步。但是,這些行爲只能控制「國家」成員。
雖然LockSupport.park和LockSupport.unpark可以同步線程的超高速緩存行。 但是如果沒有爭用,將永遠不會調用方法LockSupport。 像這樣: 1.Thread開始和運行
2.Thread b啓動和運行
3.Thread答:
lock.lock();
try{
//modify some shared members
....
}finally{
lock.unlock();
}
4.然後線程B:
lock.lock();
try{
//read shared members
....
}finally{
lock.unlock();
}
沒有爭用,線程B不會調用LockSupport方法。
lock.lock()僅CAS 「狀態」 構件,和lock.unlock()修改揮發性 「狀態」 爲0。
爲什麼線程B可以看到螺紋的修改關於共享成員?
爲什麼ReentrantLock可以用作「同步」嗎?
我沒有看到任何代碼如fullFence來同步內存。
哪個代碼實現線程緩存線的同步?
謝謝!
你的意思是** CAS **將同步線程的所有緩存行,而不是** CAS **修改字段?是嗎? – ApeStack
不,線程和緩存是JVM的實現細節。 Java(語言)定義了* Memory Model *:它保證即使內存訪問或代碼執行被重新排序,也不會有Visibile效應 – dfogni