2016-03-22 4 views
2

私は「Thinking in Java 4th Edition」を読んでいますが、私は1つの段落について質問しています。 (並行セクションのページ832)Javaのvolatileキーワード

フィールドの値は、(例えばカウンタをインクリメントするように)その 以前の値に依存し、またそれは、その値で フィールド上で動作しない場合には動作しない揮発性

のように、 という制約に従わなければならないRangeクラスの下限と上限のような他のフィールドの値によって制約されます。< = upper。

私は「動作しない揮発性」と理由揮発性キーワード何であることを理解していないが、他のフィールドを考慮しなければなりません。あなたは私を啓発することができますか、それについて私にいくつかの例を教えてもらえますか?どうもありがとうございました!

+0

これは、volatileとatomicのトピックに関連していると思います。詳細については、この記事を参照してください:http://stackoverflow.com/questions/9749746/what-is-the-difference-between-atomic-volatile-synchronized – pczeus

+1

私は本を持っていませんが、それはコンテキストがあるようです"volatileはうまくいかない"。内容に基づいて、欠けている部分は次のようなものです:_ ** "ある状況では揮発性は並行処理に役立ちますが、" ... ** _ _ volatileは、フィールドの値が以前の値に依存する場合には機能しません.....そのような文脈で、あなたの引用された段落は意味をなさないでしょう –

答えて

2

(BOOを実行する2つのスレッドが存在する場合、フィールドの値は、上記の例を考えると、その前の値に

volatile int i; 

public void bar() { 
    if (i == 0) 
    i = 1; 
    else 
    i = 2; 
} 

に依存する場合に動作)と、そのIをチェックしない揮発性0の場合、両方のスレッドがiを1に設定します。ただし、iは2に増分されると予想されます。揮発性は、ここではアトミック性を保証できません。


またそれは、低級=上側

<の制約に従わなければならない範囲クラスの下限と上限として、その値が他のフィールドの値によって制約されているフィールド、上で動作しません
public class Range { 
    private int lower, upper; 

    public void setLower(int value) { 
     if (value <= upper) 
      lower = value; 
    } 

    public void setUpper(int value) { 
     if (value >= lower)     
      upper = value; 
    } 
} 

この場合、下部フィールドと上部フィールドを揮発性にすると、スレッドセーフが保証されません。たとえば、lowerとupperの初期値がそれぞれ1と10であるとします。 setLower(6)とsetUpper(4)を同時に実行するスレッドが2つある場合、それらの両方が条件チェックに合格し、無効な範囲6〜4になります。スレッドセーフであることを保証するにはここで同期が必要です。

関連する問題