このメソッドの変数 'commonSet' が代わりにクラス レベル フィールドである場合、次のコードは同じ問題を引き起こしますか。クラス レベルのフィールドである場合、HashSet はスレッド セーフではないため、set 操作への追加を同期ブロック内にラップする必要があります。複数のスレッドがセットに追加されているか、現在のスレッドでさえセットを変更し続ける可能性があるため、次のコードで同じことを行う必要があります。
public void threadCreatorFunction(final String[] args) {
final Set<String> commonSet = new HashSet<String>();
final Runnable runnable = new Runnable() {
@Override
public void run() {
while (true) {
commonSet.add(newValue());
}
}
};
new Thread(runnable, "T_A").start();
new Thread(runnable, "T_B").start();
}
「commonSet」への参照は、final を使用して「ロック」されています。ただし、その上で動作する複数のスレッドがセット内の値を破損する可能性があります (重複が含まれている可能性がありますか?)。次に、'commonSet' ia はメソッド レベルの変数であるため、混乱が生じます。同じ参照が、呼び出し元のメソッド (threadCreatorFunction) のスタック メモリと実行メソッドのスタック メモリになります。これは正しいですか?
これに関連して、かなりの数の質問があります。
しかし、そのようなミュータブルの共有/受け渡しのスレッドセーフな部分に重点を置いているのを見ることはできません。