新しい Java メモリ モデルでは、変数への書き込みは、次のスレッドが読み取る前に完了することが保証されています。
これは、このオブジェクトのメンバーである変数にも当てはまりますか?
Java メモリ モデルの場合:
http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html
例えば
public class VolatileTest {
private volatile Map<String, Function> functionMap = new HashMap<>();
public Function getFunction(String key) {
Function function = this.functionMap.get(key);
if (function == null) {
//Is this guaranteed to be fully constructed? I don't think so.
function = new Function(key);
this.functionMap.put(key, function);
}
return function;
}
}
上記のコードのように、functionMap
volatile にしても、このメソッドが戻る前に関数オブジェクトが完全に構築されることは保証されません。
私の考えは正しいですか?
また、このトピックについては、次の点について私の考えが正しいかどうかを確認してください。
以下のように、 への書き込みはfunctionMap
、 の参照を変更する前に完了することが保証されていますfunctionMap
よね? メソッドの実行にどれだけ時間がinitializeMap
かかっても、他のスレッドには nullfunctionMap
または完全に初期化されたfunctionMap
?が表示されます。
public Map<String,Function> getFunctionMap (){
Map<String, Function> tempMap = new HashMap<>();
initalizeMap(tempMap); //fill in values
// Above operation is guaranteed to be completed
// before changing the reference of this variable.
this.functionMap = tempMap;
// So here you will either see a null or a fully initialized map.
// Is my understanding right?
return this.functionMap;
}
上記を明確にするために、上記の 2 つの例はすべてマルチスレッド環境にあり、functionMap 変数は複数のスレッドによってアクセスされます。