有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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


共 (2) 个答案

  1. # 1 楼答案

    问得好,但答案是否定的。易失性变量的读取与上次写入时同步

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

  2. # 2 楼答案

    简而言之,不是。volatile关键字只适用于foo引用,而不适用于底层对象的字段

    所以你需要把bar也标记为volatile来实现你描述的结果