2012-02-12 159 views
2

我正在研究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?

非常感謝您的善意澄清!

+1

的對象的所有同步方法使用相同的鎖定對象,該對象是對象本身,根據定義。請參閱http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html – 2012-02-12 09:06:07

回答

5

,你基本上宣告​​表現爲如果代碼是所有非靜態方法:

public synchronized int get() { 
    synchronized(this) { 
    // the method code 
    } 
} 

即有采取this隱式鎖。所以所有非靜態同步方法都會鎖定它們被調用的實例。

靜態同步方法鎖定類對象本身,而不是該類的一個實例。

+1

我相信你的意思是在你的代碼示例中使用'public int get(){'。 – 2012-02-12 09:49:18

4

是的,你的兩個方法使用相同的鎖。

​​不帶參數的關鍵字隱式轉換爲syncrhonized(this),這兩個方法都是相同的對象。

爲了使兩個塊在java中具有「相同的鎖定」,這意味着它們都使用同一個對象作爲鎖。正如我所說,在你的情況下,這兩種方法都使用this作爲鎖對象。

0

當您聲明方法​​時,這意味着同步在調用方法的特定實例上。

0

但是你有其他的同步方式。

同步塊: synchronized(someLockedObj){somecode}

鎖定對象: Lock lock = new ReentrantLock(); lock.lock(); lock.unlock();