5

假设所有属性都不是longor double,读取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 可以随时写入FooBar属性。线程 B 只能读取FooBar属性。如果线程 BBar通过 访问属性Baz,它会读取 的最新值Bar吗?

4

2 回答 2

8

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

因此,您也需要标记barvolatile达到您描述的结果。

于 2013-06-03T18:10:02.560 回答
4

好问题,但答案是否定的。volatile 变量的读取与上次写入的时间同步。

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

于 2013-06-03T18:10:53.413 回答