0

volatileこの Q では、Java がフィールドを可視化する正確な方法について具体的な詳細を探しています。

Javaのvolatileキーワードは、変数への書き込み操作が完了した直後に、その変数のリーダーに変数を「アクティブに」表示するために使用されます。これは、発生する前の関係の 1 つの形式です。書き込みの結果を、その変数のそのメモリ位置にアクセスして何らかの用途に使用する人に公開します。そして、使用すると、その変数に対する読み取り/書き込み操作がアトミックになります。 long&doubleについても同様です。他のすべての var 型への R/W は既にアトミックです。

書き込み操作の後に変数値を可視化するために Java が何をするかを知りたいですか?

例: 次のコードは、このディスカッションに関する回答の 1 つからのものです。

public class Foo extends Thread {
  private volatile boolean close = false;
  public void run() {
    while(!close) {
      // do work
    }
  }
  public void close() {
    close = true;
    // interrupt here if needed
  }
}

ブール値リテラルの読み取りと書き込みはアトミックです。上記のメソッドclose()が呼び出された場合、 as として宣言されていなくても、 closeasの値を設定するのはアトミック操作です。truevolatile

このコードでさらにvolatile行っていることは、この値への変更が発生した瞬間に確実に見られるようにすることです。

これをどのように正確volatileに達成していますか?

volatile 変数を操作するスレッドを優先することによって? もしそうなら - どのように、スレッドスケジューリングで、または読み取り操作を伴うスレッドを作成して、フラグを調べて、保留中のライタースレッドがあるかどうかを確認しますか? 「揮発性フィールドへの書き込みは、同じフィールドの後続のすべての読み取りの前に発生する」ことを認識しています。読み取り専用のスレッドにCPU時間を与える前に、揮発性変数に書き込み操作を行うスレッドの中から選択していますか?

これがスレッド スケジューリング レベルで管理されている場合 (これは疑問です)、揮発性フィールドに書き込みを行うスレッドを実行すると、見た目よりも大きな効果があります。

volatileJavaは変数の可視性をどの程度正確に管理していますか?

ティア。

4

2 に答える 2

3

これによれば :

http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#volatile

Java の新しいメモリ モデルは、次の方法でこれを行います。

1) コンパイラとランタイムが揮発性変数をレジスタに割り当てることを禁止します。

2) コンパイラ/オプティマイザがコードからのフィールド アクセスの順序を変更できないようにする。事実上、これはロックを取得するようなものです。

3) 揮発性変数が書き込まれるとすぐにキャッシュからメイン メモリにフラッシュするようにコンパイラ/ランタイムに強制します。

4) 揮発性フィールドが読み取られる前にキャッシュを無効としてマークする。

記事から:

「揮発性フィールドは、スレッド間で状態を通信するために使用される特別なフィールドです。揮発性の各読み取りは、任意のスレッドによるその揮発性への最後の書き込みを確認します。実際、それらはプログラマーによって、決して受け入れられないフィールドとして指定されます。キャッシュや並べ替えの結果として「古い」値が表示されます. コンパイラとランタイムはそれらをレジスタに割り当てることを禁じられています. また, 書き込まれた後, キャッシュからメインメモリにフラッシュされることを保証しなければなりません.同様に、揮発性フィールドが読み取られる前に、ローカル プロセッサ キャッシュではなくメイン メモリ内の値が表示されるように、キャッシュを無効にする必要があります。変数。」

... 「揮発性フィールドへの書き込みには、モニターの解放と同じメモリ効果があり、揮発性フィールドからの読み取りには、モニターの取得と同じメモリ効果があります。実際には、新しいメモリモデルでは揮発性の並べ替えに厳しい制約が課されるためです。 volatile かどうかに関係なく、他のフィールド アクセスを伴うフィールド アクセス..."

于 2014-10-05T17:29:31.270 に答える