16

簡単な質問:Javaメモリ/同期モデルはアトミックポインタの書き込みを保証しますか?つまり、競合するスレッドがある場合:

String shared;

thread1()
{
    shared = "a";
}

thread2()
{
    shared = "hello world";
}

同時に開始され、常に、、、または?でsharedあることが保証されますnull"a""hello world"

4

4 に答える 4

10

読み取りと書き込みは、参照変数に対してアトミックです。

出典:http ://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html

于 2012-06-20T22:18:28.997 に答える
7

アトミックです。

ただし、指定した例では、sharedの値は必ずしも、、またはのいずれかはありません。適切な同期がないと、各スレッドが他のスレッドによって設定された値を認識できない可能性があります。だから、見ると同時に見るでしょう。nullahello worldthread 1athread 2hello world

編集:さらに読むために最後の段落の参照を追加しました

JLSでは、第17章-スレッドとロックで、さまざまなスレッドによって実行される操作の順序について説明しています。具体的には、17.4.5Happens-beforeOrderセクションにあります。また、よく書かれたJava Concurrency in Practiceは、これらすべてを徹底的に説明しています。

于 2012-06-20T22:23:08.703 に答える
4

はい。JLSのセクション17.7から:

参照の書き込みと読み取りは、32ビット値と64ビット値のどちらとして実装されているかに関係なく、常にアトミックです。

(これは、常に「最新の」値が表示されるという意味ではありませんが、それは別の問題です。)

于 2012-06-20T22:19:31.463 に答える
3

はい、これら3つの値の1つになりますが、これは未定義です。「勝ち」の最後の1つ。

あなたは尋ねませんでしたが、完全を期すために-それは「こんにちはwor」またはその文字列の一部のバージョンではありません。

于 2012-06-20T22:17:14.987 に答える