非プリミティブ変数 ( myObject) のロックをテストするために作成したクラスに従うことを検討してください。すべてのスレッドが の同じオブジェクト インスタンスで動作している場合SynchronizationTest、私の質問は次のとおりです。
set(...)スレッド1がメソッドを実行している場合、他のスレッド(スレッド2としましょう)はまたはのいずれかを実行しても問題ないanotherSetWithSynchronized(...)ことを理解していますanotherSetWithoutSynchronized(...)。
thread1 が
SynchronizationTest実行中のオブジェクトをロックした場合set(...)、それはすべてのメンバー オブジェクト変数のロックを取得したことを意味しますか? この場合のようにmyObject。そうでない場合は、スレッド 1 が実行されている場合、スレッド 2 は同時に実行
set(...)できanotherSetWithSynchronized(...)ますか?スレッドで同時に実行できる 2 つのメソッドはありませんか?
この設計は間違っていますか?メソッドを明示的にロックする必要があります
myObjectかsynchronizedset(...)。このような:public synchronized void set(MyValue myValue) { synchronized (myObject) { myObject.put(myValue); } }
これが私のコードです:
public class SynchronizationTest {
private MyObject myObject = new MyObject();
public synchronized void set(MyValue myValue) {
myObject.put(myValue);
}
public void anotherSetWithSynchronized(MyValue myValue) {
synchronized (myObject) {
myObject.put(myValue);
}
}
public void anotherSetWithoutSynchronized(MyValue myValue) {
myObject.put(myValue);
}
}