私は今、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を変更する方法は何ですか?
あなたの親切な説明をありがとうございました!!!!
すべての同期方法は、定義により、オブジェクト自体で同じロックオブジェクトを使用します。 http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html –