誰でもこのクラスがスレッドセーフであるかどうかを教えてもらえますか?Javaの同時実行性:最終フィールド(コンストラクタで初期化される)はスレッドセーフですか?
class Foo {
private final Map<String,String> aMap;
public Foo() {
aMap = new HashMap<String, String>();
aMap.put("1", "a");
aMap.put("2", "b");
aMap.put("3", "c");
}
public String get(String key) {
return aMap.get(key);
}
}
編集:質問を明確にしないと私のせいです。 JMM FAQによる:
初期化の安全性の新しい保証が提供される必要があります。オブジェクトが適切に構築されている場合(つまり、構築中に参照がエスケープされない場合)、そのオブジェクトへの参照を参照するすべてのスレッドには、コンストラクタで設定された最終フィールドの値も表示されます同期。
これは、aマップに設定されたものがaMap = new HashMap<String, String>();
であることを私に混乱させました。だから他のスレッドはこれらを見ることができます
aMap.put("1", "a");
aMap.put("2", "b");
aMap.put("3", "c");
またはそうではありませんか?
編集:私は、まさに私の質問に閉じ、このquestionを見つけ
しかし、最終的なキーワードの存在はそれとはまったく関係がないため、まだ混乱があるようです。あなたが何が起こっているかを説明したなら、私たちはもっと助けることができるかもしれません。 – Affe
ああ!あなたが今尋ねていることを見てください。明らかに、私はマネージドシングルトンビーンの土地で過ごす時間が多すぎます。はい。もし、あなたがリンクした記事が要約するJava言語仕様のセクション17.5のすべてを読んでいれば、最終フィールドで参照されるオブジェクトも構築終了時に最新のものであることが言及されています。 – Affe