我知道同步方法和同步塊之間的區別,但我不確定關於同步塊部分。lockObject上的synchronized和使用此鎖作爲鎖之間有什麼區別?
假設我有這樣的代碼
class Test {
private int x=0;
private Object lockObject = new Object();
public void incBlock() {
synchronized(lockObject) {
x++;
}
System.out.println("x="+x);
}
public void incThis() { // same as synchronized method
synchronized(this) {
x++;
}
System.out.println("x="+x);
}
}
在這種情況下就是使用lockObject和使用這爲鎖定的區別?它似乎對我來說是一樣的。
當你決定使用同步塊時,你如何決定哪個對象是鎖?
我找到了答案,我的問題在 http://stackoverflow.com/questions/3047564/java-synchronized-method-lock-on-object-or-method 如果你看一下答案,這是非常清楚,如果有2個線程(t1和t2),其中t1調用x.addA(),t2調用x.addB()。如果addA和addB都將此作爲鎖,則x.addA()和x.addB()不能同時運行。 而如果如果ADDA和ADDB使用不同對象的鎖,這兩個方法可以同時運行 – GantengX 2010-07-30 07:11:40
只是爲了檢查的內容:在上面的例子中,當您使用lockObject有效防範訪問x是不是有一種情況,另一個線程可能在同步塊之後但在println之前進入並再次增加x?即你真的需要在同步塊內的println嗎? – 2010-07-30 08:40:42
啊,我應該把它放在同步塊中,但我已經回答了我自己的問題:D – GantengX 2010-08-04 11:34:37