假设所有属性都不是long
或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可以随时写入Foo
的{{1}}属性。线程B只能读取Bar
的{{1}}属性。如果线程B通过Foo
访问Bar
属性,它是否会读取Bar
的最新值?
答案 0 :(得分:8)
总之没有。 volatile
关键字仅适用于foo
引用,而不适用于基础对象的字段。
因此,您需要将bar
标记为volatile
,以达到您描述的结果。
答案 1 :(得分:4)
很好的问题,但答案是没有。读取volatile变量与上次写入时同步。
因此,非空baz
至少确保foo.bar
的第一个值,而不是任何连续写入。当然,如果在写foo.bar
baz