繁体   English   中英

Java 中的 volatile 关键字

[英]volatile keyword in Java

我现在正在阅读“Thinking in Java 4th Edition”,我对一段有疑问。 (第 832 页,在并发部分)

当字段的值取决于其先前的值(例如递增计数器)时, volatile 不起作用,也不适用于值受其他字段值约束的字段,例如 a 的下限和上限必须遵守约束下限 <= 上限的范围类。

我不明白什么是“volatile 不起作用”以及为什么关键字volatile必须考虑其他字段。 你能启发我,或者你能给我一些关于它的例子吗? 非常感谢!

当字段的值取决于其先前的值时, volatile 不起作用

volatile int i;

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

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


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

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字段设置为volatile并不能保证线程安全。 例如,假设lower和upper的初始值分别是1和10。 如果有两个线程同时运行 setLower(6) 和 setUpper(4),它们都可以通过条件检查,导致无效范围 6 到 4。所以这里需要同步以保证线程安全。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM