2017-03-23 16 views
3

我知道的ReentrantLock使用的AbstractQueuedSynchronizerAQS)實施鎖定。 但是實現的細節,我無法理解。Java併發:ReentrantLock是一個錯誤的設計?

我知道AQS使用volatile,CAS和旋轉同步。但是,這些行爲只能控制「國家」成員。

雖然LockSupport.parkLockSupport.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來同步內存。

哪個代碼實現線程緩存線的同步?

謝謝!

回答

0

CAS操作定義發生在關係之前,所以Java存儲器模型保證從一個線程的存儲器修改將從另一個可見。

+0

你的意思是** CAS **將同步線程的所有緩存行,而不是** CAS **修改字段?是嗎? – ApeStack

+0

不,線程和緩存是JVM的實現細節。 Java(語言)定義了* Memory Model *:它保證即使內存訪問或代碼執行被重新排序,也不會有Visibile效應 – dfogni