次のコードがスレッドセーフかどうか知りたいです:
public static void methodA () {
// given that mutableObject is not thread-safe (no lock/synchronization used)
MutableObject mo = new MutableObject();
mo.setSomeValue(100); // set an int value
// the mutableList variable must be final in order to pass it to the thread block
final List<mutableObject> mutableList = new ArrayList<mutableObject>();
mutableList.add(mo);
Thread t = new Thread() {
@Override
public void run() {
for (mutableObject e : mutableList) {
e.printIntValue(); // print 100 or 0?
}
}
}
t.start();
}
それで、ここに質問があります。明示的な同期/ロックが使用されていなくても、「mutableList」参照から到達可能な*すべてのコンテンツが新しいスレッドに表示されるかどうかはわかりません。(可視性の問題) つまり、新しいスレッドは 0 または 100 を出力しますか? 0 は int データ型のデフォルトのプリミティブ値であるため、メイン スレッドによって設定された値 100 が表示されない場合は 0 を出力します。
すなわち。「到達可能なコンテンツ」とは、次のことを意味します。
- MutableObject が保持する int 値 100
- ArrayList が保持する MutableObject への参照
回答ありがとうございます。