私が理解しているように、synchronized
ブロック内の以下のコードthis
はカウンターのインスタンスです。
質問 1:以下の例では、スレッド A がブロックに到達するとsynchronized
、スレッド B がブロックされてカウンターのインスタンスに対して何もできないということですか? 言い換えれば、これは、スレッドが好きなように実行し続けることができるが、どちらかが synchronized
ブロックに到達すると、ブロックが終了するまで他のスレッドがクラスに対して何もしないことを意味しますか?
public class Counter {
public void increment() {
// Some code
synchronized (this) { // <---- "this" is an instance of Counter
// Some more code
}
}
}
上記のコードを比較してください
public class Counter {
List<String> listOfStrings = new ArrayList<String>();
public void increment() {
// Some code
synchronized (listOfStrings) {
// Some code that deals with
// listOfStrings
}
}
}
質問 2:上記の例では、スレッド A がブロックに到達すると、スレッド B は、ブロック内のArrayList をsynchronized
除いて、クラス内のすべての読み取りと書き込みを続行できます。これは正しいです?listOfStrings
mutex
synchronized
質問 3:this
複数のオブジェクトを変更する必要がある場合、を使用する必要があると仮定するのはさらに正しいmutex
ですか?
例えば:
public class Counter {
List<String> listOfStrings = new ArrayList<String>();
List<Integers> listOfIntegers = new ArrayList<Integers>();
public void increment() {
// Some code
synchronized (this) {
// Some code that deals with
// listOfStrings and listOfIntegers
}
}
}
私は物事を正しく理解していますか?何か言い間違いがあれば訂正してください。