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