私が書いたいくつかの重要なクラスで、スレッドセーフについて心配する必要があるかどうかを判断しようとしています。私はいくつかの記事/既存の SO の質問を読みましたが、スレッド セーフの同じ繰り返し定義を見続けています。
スレッド セーフとは、オブジェクトまたはクラスのフィールドが、複数のスレッドで同時に使用された場合でも、他のオブジェクトやクラスから観察されるように、常に有効な状態を維持することを意味します。
わかった。なんとなくわかります。しかし、私がここで見逃しているパズルの非常に大きなピースがあります。
スレッドセーフは、クラスの同じインスタンスが複数のスレッドで使用されている場合、または2つ以上のインスタンスが使用されている場合にのみ機能しますか?
例 #1:
Dog
静的メソッドまたはフィールドを含まないクラスがあり、5 つの異なるスレッド内から操作されている a の 5 つの異なるインスタンスがあるとDog
します。スレッドセーフについて心配する必要はありますか? Dog
静的フィールド/メソッドがなく、各スレッドには、他の 4 つのインスタンスとは無関係に状態が存在する独自のインスタンスがあるため、「いいえ」と言うでしょう。(1) これは正しいですか。そうでない場合、なぜですか?
例 #2:
に静的メソッドを追加するとしますDog
。
public void woof() {
this.isWoofing = true;
}
public static void makeWoof(Dog dog) {
dog.woof();
}
今、スレッドセーフについて心配する必要がありますか? 各スレッドには の独自のインスタンスがありますがDog
、現在は同じ静的makeWoof()
メソッドを共有しており、Dog
それが動作している の状態を変更します。私はまだ「いいえ」と言います。(2) これは正しいですか。そうでない場合、なぜですか?
これら 2 つの例を考えると、複数のスレッドがクラスの同じインスタンスで動作している場合にのみ、スレッド セーフが問題になるように思えます。しかし、各スレッドに独自のインスタンスを与えるとすぐに、そのインスタンスに対してやりたいことが何でもできるようになり、他のスレッド内で何が起こっているかを気にする必要がなくなります。(3) これは正しいですか。そうでない場合、なぜですか?これに対する例外はありますか?前もって感謝します!