Java中的volatile关键字

时间:2016-03-22 01:52:36

标签: java volatile

我正在阅读"思考Java第4版"现在,我有一个关于一个段落的问题。 (第832页,在“并发”部分中)

  当字段的值取决于它时,

volatile不起作用   先前的值(例如递增计数器),也不起作用   值受其他字段值约束的字段,   例如必须遵守的Range类的下限和上限   约束低于< = upper。

我不明白什么是" volatile不起作用"以及为什么关键字 volatile 必须考虑其他字段。你能告诉我还是能给我一些关于它的例子?非常感谢你!

1 个答案:

答案 0 :(得分:2)

  当字段的值取决于其先前的值

时,

volatile不起作用

volatile int i;

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

考虑到上面的例子,如果有两个线程运行boo()并检查i是0,则两个线程然后将i设置为1.但是,我希望增加到2.易失性不能保证这里的原子性。


  

也不适用于其值受其他字段值约束的字段,例如Range类的下限和上限,必须遵守约束下限< = upper

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),则它们都可以通过条件检查,从而导致无效范围6到4.因此,这里需要同步以保证线程安全。