我正在阅读"思考Java第4版"现在,我有一个关于一个段落的问题。 (第832页,在“并发”部分中)
当字段的值取决于它时,volatile不起作用 先前的值(例如递增计数器),也不起作用 值受其他字段值约束的字段, 例如必须遵守的Range类的下限和上限 约束低于< = upper。
我不明白什么是" volatile不起作用"以及为什么关键字 volatile 必须考虑其他字段。你能告诉我还是能给我一些关于它的例子?非常感谢你!
答案 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.因此,这里需要同步以保证线程安全。