我一直在研究Java中的併發性,我沒有看到關鍵字同步和同步概念之間的關係。關鍵字同步和同步概念
爲了說明的方便把它
public class MyClass {
int Counter = 0;
public synchronized void incrementation(Int newValue){
Counter += newValue;
}
}
如果我的方法遞增每次授予一個線程訪問,同步在哪裏?
我一直在研究Java中的併發性,我沒有看到關鍵字同步和同步概念之間的關係。關鍵字同步和同步概念
爲了說明的方便把它
public class MyClass {
int Counter = 0;
public synchronized void incrementation(Int newValue){
Counter += newValue;
}
}
如果我的方法遞增每次授予一個線程訪問,同步在哪裏?
關鍵字在您的函數的簽名中只允許一個線程一次運行該函數。這會同步對Counter
變量的多線程訪問。
在這種特殊情況下,Counter
的增量在機器代碼中很可能被實現爲從存儲器到處理器寄存器的值的讀取,處理器寄存器中的數字的增量以及遞增的寫入值回到內存。沒有同步,運行在不同處理器上的兩個線程可能會同時執行此操作,從內存中讀取相同的值,每個線程在其各自的處理器中遞增該值,並將相同的遞增值寫回內存。儘管事實上兩個線程實際上已經增加了值,但這會導致內存中的增量僅爲1。使用關鍵字可確保線程按順序訪問存儲器值;如果兩個線程同時嘗試執行遞增操作,它們將輪流運行,並且內存中的最終值會增加兩次,以反映增加該值的線程數。
感謝您的考慮。 –
我的困惑不是關於這個資源的建議。我一直在尋找名爲「synchronized」的邏輯,只要每次一個線程進入這個方法,它就會鎖定它,直到「完成工作」。我沒有看到將此塊稱爲「同步」的好理由,前提是每次只有一個線程使用它。 –
考慮到這個問題,我已經意識到,只要一個或多個線程可以使用這個代碼塊,我們有一個很好的理由稱之爲「同步」。如果我錯了,請糾正我。 –
如果由JVM或由JVM生成的代碼執行同步。你能澄清你的疑問嗎? –
[Java同步](http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html) –
請注意,使用'synchronized'關鍵字時的同步只發生在同一個實例中。 – Mauren