簡単な質問:Javaメモリ/同期モデルはアトミックポインタの書き込みを保証しますか?つまり、競合するスレッドがある場合:
String shared;
thread1()
{
shared = "a";
}
thread2()
{
shared = "hello world";
}
同時に開始され、常に、、、または?でshared
あることが保証されますnull
"a"
"hello world"
簡単な質問:Javaメモリ/同期モデルはアトミックポインタの書き込みを保証しますか?つまり、競合するスレッドがある場合:
String shared;
thread1()
{
shared = "a";
}
thread2()
{
shared = "hello world";
}
同時に開始され、常に、、、または?でshared
あることが保証されますnull
"a"
"hello world"
読み取りと書き込みは、参照変数に対してアトミックです。
出典:http ://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html
アトミックです。
ただし、指定した例では、shared
の値は必ずしも、、またはのいずれかではありません。適切な同期がないと、各スレッドが他のスレッドによって設定された値を認識できない可能性があります。だから、見ると同時に見るでしょう。null
a
hello world
thread 1
a
thread 2
hello world
編集:さらに読むために最後の段落の参照を追加しました
JLSでは、第17章-スレッドとロックで、さまざまなスレッドによって実行される操作の順序について説明しています。具体的には、17.4.5Happens-beforeOrderセクションにあります。また、よく書かれたJava Concurrency in Practiceは、これらすべてを徹底的に説明しています。
はい。JLSのセクション17.7から:
参照の書き込みと読み取りは、32ビット値と64ビット値のどちらとして実装されているかに関係なく、常にアトミックです。
(これは、常に「最新の」値が表示されるという意味ではありませんが、それは別の問題です。)
はい、これら3つの値の1つになりますが、これは未定義です。「勝ち」の最後の1つ。
あなたは尋ねませんでしたが、完全を期すために-それは「こんにちはwor」またはその文字列の一部のバージョンではありません。