JavaアプリケーションをScalaに移植しようとしています。ダブルバッファから読み取ることとDouble.doubleToRawLongBits(value)
がバッファに書き込むDouble.longBitsToDouble(value)
の結果を使用して、 - Javaアプリケーションの一部は、フードの下でAtomicLongArray
を使用AtomicDoubleBuffer
と呼ばれる実装を有しています。私は良いかもしれScalaの実装のためのネットを中心に見てきたと私はthisに上陸揮発性要素の配列を実装する方法
れ、このコードブロック
class VolatileDoubleArray(val length : Int){
val array = new Array[Double](length);
@volatile var marker = 0;
def apply(i : Int) = {marker; array(i); }
def update(i : Int, x : Double) { array(i) = x; marker = 0; }
}
は私が起きる前に、保証与えるべきであると述べています。しかし、私はこのことがどうなるか少し混乱しています。 1つの変数上の揮発性マーカーが、前の不揮発性「操作」が成功すると判断する理由は何ですか? JSL 17.4.5の私の解釈は、一つのスレッドでarray
という要素を更新しても、他のスレッドがその更新を見ることを保証するものではないことを示唆しています。何か不足していますか?あるいは、私は起こっていることの全てを混乱させていますか?あなたの例では
Hmmはそれを認識していませんでした。しかし、そのコードスニペットでは、 'marker 'が値' 0 'で初期化され、常に同じ値に設定されているので、任意の最適化を実行する任意の自由度でコンパイラではありません。私はわからないが、これはコンパイラが完全に最適化できるもののように見える。あるいは、これは揮発性の変数では違法ですか? – Michael
いいえ、コンパイラは、並行プログラミングに影響を与える可能性のある揮発性変数に対して最適化を実行する自由を持っていません(volatileへの読み書きの副作用がメモリバリアを形成しているため)実行時にそれらのために変更された、それはまさに揮発性変数の目的です。 –
そして、いくつかのポインタのために、私はこれは良い参考です信じて:http://stackoverflow.com/questions/30246007/java-memory-model-volatile-variables-and-happens-before –