我正在研究Java併發。我有一個關於和鎖的問題。Synchronzied Getter和Setter
對於任何可變數據,我們應該把所有訪問數據的方法放在同一個鎖中。
但是,同樣的鎖意味着什麼?
例子:
public class SynchronizedInteger{
private int value;
public synchronized int get(){return value;}
public synchronized void set(int value){this.value=value;}
}
所以,我的問題是,爲什麼這兩種方法都在同一個鎖?我知道他們是,但我想知道爲什麼?而且,這是否意味着班級中的所有同步方法都在同一個鎖中?
編輯:
所以,如果我增加了一個方法的類:
public synchronized void printOneToHunder(){
for(int i=0;i<100;i++) System.out.println(i);
}
這種方法也將被包括在相同的塊setter和getter?那麼,當有一個線程使用setter或getter時,其他線程無法運行此方法?
而且,如果我改變類下面:
public class SynchronizedInteger{
private int value1;
private int value2;
public synchronized int get1(){return value1;}
public synchronized void set1(int value){this.value1=value1;}
public synchronized int get2(){return value2;}
public synchronized void set2(int value){this.value2=value2;}
}
對於我的瞭解,現在,只有一個線程可以同時調用這些方法。那麼如何讓一個線程可以修改value1而另一個線程修改value2?
非常感謝您的善意澄清!
的對象的所有同步方法使用相同的鎖定對象,該對象是對象本身,根據定義。請參閱http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html – 2012-02-12 09:06:07