读取对象的volatile引用是否保证原子读取其属性的最新值?

时间:2013-06-03 18:08:23

标签: java concurrency

假设所有属性都不是longdouble,那么读取对象的volatile引用是否保证原子读取其属性的最新值?

这是一个具体的例子。

public class Foo {
    private int bar;

    public int getBar() {
        return this.bar;
    }

    public void setBar(int bar) {
        this.bar = bar;
    }
}

public class Baz {
    private volatile Foo foo;
}

线程A可以随时写入Foo的{​​{1}}属性。线程B只能读取Bar的{​​{1}}属性。如果线程B通过Foo访问Bar属性,它是否会读取Bar的最新值?

2 个答案:

答案 0 :(得分:8)

总之没有。 volatile关键字仅适用于foo引用,而不适用于基础对象的字段。

因此,您需要将bar标记为volatile,以达到您描述的结果。

答案 1 :(得分:4)

很好的问题,但答案是没有。读取volatile变量与上次写入时同步。

因此,非空baz至少确保foo.bar的第一个值,而不是任何连续写入。当然,如果在写foo.bar

之前写入baz