Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的volatile关键字_Java_Volatile - Fatal编程技术网

Java中的volatile关键字

Java中的volatile关键字,java,volatile,Java,Volatile,我正在读《Java第四版思考》,我对其中一段有一个问题。(第832页,并发部分) 当字段的值取决于其属性时,volatile不起作用 以前的值(例如递增计数器),也不适用于 其值受其他字段值约束的字段, 例如必须遵循 约束较低 当字段的值取决于其先前的值时,volatile不起作用 考虑上面的示例,如果有两个线程运行boo()并检查i是否为0,则两个线程都将i设置为1。但是,预计i将增加到2。Volatile在这里不能保证原子性 它也不适用于其值受其他字段值约束的字段,例如必须遵守约束下限的R

我正在读《Java第四版思考》,我对其中一段有一个问题。(第832页,并发部分)

当字段的值取决于其属性时,volatile不起作用 以前的值(例如递增计数器),也不适用于 其值受其他字段值约束的字段, 例如必须遵循 约束较低 当字段的值取决于其先前的值时,volatile不起作用

考虑上面的示例,如果有两个线程运行boo()并检查i是否为0,则两个线程都将i设置为1。但是,预计i将增加到2。Volatile在这里不能保证原子性



它也不适用于其值受其他字段值约束的字段,例如必须遵守约束下限的Range类的下限和上限。我认为这与volatile vs.atomic主题有关。有关更多信息,请参阅本文:我没有这本书,但似乎有“volatile不起作用”的上下文。根据内容,这里缺少的部分类似于:“Volatile在某些情况下有助于并发,但是”。。。当字段的值取决于其以前的值时,volatile不起作用。。。。。在这样的背景下,你引用的段落会有意义
volatile int i;

public void bar() {
  if (i == 0) 
    i = 1;
  else 
    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;
    }
}