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 として宣言されていなくても、 close
asの値を設定するのはアトミック操作です。true
volatile
このコードでさらにvolatile
行っていることは、この値への変更が発生した瞬間に確実に見られるようにすることです。
これをどのように正確volatile
に達成していますか?
volatile 変数を操作するスレッドを優先することによって? もしそうなら - どのように、スレッドスケジューリングで、または読み取り操作を伴うスレッドを作成して、フラグを調べて、保留中のライタースレッドがあるかどうかを確認しますか? 「揮発性フィールドへの書き込みは、同じフィールドの後続のすべての読み取りの前に発生する」ことを認識しています。読み取り専用のスレッドにCPU時間を与える前に、揮発性変数に書き込み操作を行うスレッドの中から選択していますか?
これがスレッド スケジューリング レベルで管理されている場合 (これは疑問です)、揮発性フィールドに書き込みを行うスレッドを実行すると、見た目よりも大きな効果があります。
volatile
Javaは変数の可視性をどの程度正確に管理していますか?
ティア。