(一些進一步的思考後經修訂)
對於你上面介紹可以宣佈你的靜態INT揮發,朋克樂隊建議跑不掉的例子。
然而,在一般情況下 - 例如,如果你的靜態可變用的可變狀態的對象...
的同步實例方法意味着只有線保持物體實例鎖被允許在進步該類的實例的方法,並且當線程在方法中完成並釋放鎖時,任何其他線程使用同一個鎖進入任何同步塊將「看到」您所做的更改。
它不防止被另一個線程其中靜態變量正在作出改變:
- 新值從外部直接A級分配給靜態變量(該變量是公開的!)
- 調用哪個重新分配靜態變量,因爲它會使用不同的鎖定
- 類A的一個靜態方法(同步或以其他方式)調用類A
的非同步實例方法,使用同步方法通常是有點危險 - 它們可以導致死鎖,因爲鎖可以由使用你的類/實例作爲同步塊的目標其他代碼外採取:
synchronized (objectOfTypeA) { ... } // takes the instance lock
或
synchronized (A.getClass()) { ... } // takes the class lock
更好的方法可能是將靜態變量設置爲private,添加一個專用本地變量作爲鎖(因此它不能被鎖定在外部),並在方法的synchronized塊中使用專用本地鎖:
public class A {
private static int reg_no = 100;
private static Object lock = new Object();
public void registration(){
synchronized(lock) {
reg_no = some operation...
}
}
public static int getRegNo() {
synchronized(lock) {
return reg_no;
}
}
}
單獨的方法同步不*防止可能的併發訪問'靜態'變量,特別是如果有靜態方法,也可能會修改靜態變量。 – 2010-10-12 09:23:55
這就是我所說的。它只會保護該方法的多個調用。不是其他人。但他的例子並沒有說明其他人是否可以訪問它。 – Bozho 2010-10-12 09:26:09