java读取对象的易失性引用是否能保证原子读取其属性的最新值?
假设所有属性都不是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
的Bar
属性。线程B只能读取Foo
的Bar
属性。如果线程B通过Baz
访问Bar
属性,它会读取Bar
的最新值吗
# 1 楼答案
问得好,但答案是否定的。易失性变量的读取与上次写入时同步
因此,非空的
baz
至少确保了foo.bar
的第一个值,但不保证任何连续写入。当然,如果foo.bar
是在baz
的写入之前写入的# 2 楼答案
简而言之,不是。
volatile
关键字只适用于foo
引用,而不适用于底层对象的字段所以你需要把
bar
也标记为volatile
来实现你描述的结果