2012-02-12 6 views
2

私は今、Javaの並行性を研究しています。​​とロックに関する質問があります。シンクロザイドゲッターとセッター

変更可能なデータについては、データにアクセスするすべてのメソッドを同じロックに配置する必要があります。

しかし、同じロックはどういう意味ですか?

例:

public class SynchronizedInteger{ 
    private int value; 
    public synchronized int get(){return value;} 
    public synchronized void set(int value){this.value=value;} 
} 

この2つの方法が同じロックである理由だから、私の質問はありますか?私は彼らがいることを知っていますが、私は理由を知りたいのですか?そして、クラス内のすべての同期メソッドが同じロック内にあることを意味しますか?

編集:私はクラスに1つの以上の方法を追加した場合

はそう、:

public synchronized void printOneToHunder(){

for(int i=0;i<100;i++) System.out.println(i); 

}

この方法はまた、セッターとゲッターと同じブロックに含まれるのでしょうか?したがって、setterまたはgetterのいずれかを使用しているスレッドが1つある場合、このメソッドは他のスレッドで実行できません。

そして、私は以下のクラスを変更した場合、どのような:

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;}  
} 

私の理解のために、今、唯一つのスレッドが一度にこれらのメソッドを呼び出すことができます。では、1つのスレッドでvalue1を変更し、もう一方のスレッドでvalue2を変更する方法は何ですか?

あなたの親切な説明をありがとうございました!!!!

+1

すべての同期方法は、定義により、オブジェクト自体で同じロックオブジェクトを使用します。 http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html –

答えて

5

コードだったかのようにあなたが​​を宣言するすべての非静的メソッドは、基本的に振る舞う:

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

はすなわち取らthis上の暗黙のロックがあります。したがって、すべての非静的同期メソッドは、呼び出されたインスタンスをロックします。

静的同期メソッドは、そのクラスのインスタンスではなく、クラスオブジェクト自体をロックします。

+1

を参照してください。コード例で 'public int get(){'を意味すると思います。 –

4

はい、2つの方法で同じロックが使用されています。

パラメータなしの​​キーワードは、両方の方法で同じオブジェクトであるsyncrhonized(this)に暗黙的に変換されます。

2つのブロックがjavaで「同じロック」を持つためには、両方が同じオブジェクトをロックとして使用していることを意味します。私が言ったように、あなたのケースでは、どちらの方法もロックオブジェクトとしてthisを使用しています。

0

メソッド​​を宣言すると、そのメソッドが呼び出されている特定のインスタンスで同期が行われていることを意味します。

0

しかし、同期のための他の方法があります。

同期ブロック: synchronized(someLockedObj){somecode}

ロックオブジェクト:オブジェクトの Lock lock = new ReentrantLock(); lock.lock(); lock.unlock();

関連する問題