2

James GoslingのJLSを読んでいて、これに出くわしました-

Java プログラミング言語は、いくつかの目的でロックするよりも便利な、 (同期以外の)揮発性フィールドという2 番目のメカニズムを提供します。

フィールドはvolatileと宣言される場合があります。この場合、Java メモリ モデルは、すべてのスレッドが変数の一貫した値を参照することを保証します。次に、作成者はこのリソースを指します。

ここに画像の説明を入力

その結果r2 == 2r1 == 1不可能に見えるかもしれません。 しかし、なぜ?

このようなことを考えるのは完全に理にかなっているではありませんか-

Instruction 4 : A = 2;
Instruction 1 : r2 = A;
Instruction 2 : B = 1;
Instruction 3 : r1 = B;

そして残りは私も理解できませんでした。

r2 == 2 と r1 == 1 という結果はありえないように見えるかもしれません。直感的には、命令 1 または命令 3 のいずれかが最初に実行されます。命令 1 が最初に来る場合、命令 4 の書き込みを認識できないはずです。命令 3 が最初に来る場合、命令 2 の書き込みを認識できないはずです。

何らかの実行がこの動作を示した場合、命令 4 が命令 1 の前に発生し、命令 2 が命令 2 の前に発生し、命令 3 が命令 4 の前に発生したことがわかります。これは一見、ばかげています。

ただし、コンパイラは、どちらかのスレッドの命令を並べ替えることができますが、これがそのスレッドの実行に単独で影響を与えない場合です。表 17.4-B のトレースに示すように、命令 1 が命令 2 で並べ替えられた場合、結果 r2 == 2 および r1 == 1 がどのように発生するかを簡単に確認できます。

例えてください。

4

1 に答える 1

0

これは、英作文でよく見られる修辞パターンです。作家は、何かが「そう見える」かもしれない、または誰かが何かが「そうである」と「考えるかもしれない」と言い、その結論につながる可能性のある無効な理由を説明し、その後、実際にはそうではないことを説明します.ケース。この修辞技法を使用して、中間セクションは、書き手が間違っていると認識しているステートメントで構成されます。

引用しているセクションは、あなたがすでに理解していることを正確に説明することを目的としています.シングルスレッドコードに影響を与えない場合、コンパイラは通常、メモリの読み取りと書き込みを自由に並べ替えることができます.

たとえば、この段落では次のようになります。

r2 == 2 と r1 == 1 という結果はありえないように見えるかもしれません。直感的には、命令 1 または命令 3 のいずれかが最初に実行されます。命令 1 が最初に来る場合、命令 4 の書き込みを認識できないはずです。命令 3 が最初に来る場合、命令 2 の書き込みを認識できないはずです。

「現れるかもしれない」とは、誰かがそう思うかもしれないという意味ですが、そうではありません。次に、なぜ誰かがそれを考えるのかを説明し、次になぜそれが間違っているのかを説明します. その段落の最初の文の後の文は、書き手が間違っていることを知っており、どのように間違っているかを説明し続けます。

于 2016-07-28T18:42:06.570 に答える