首页 > 解决方案 > 对象变量的 L 缓存自动优化?

问题描述

坦率地说,这是我的问题的继续,受到这个答案的启发:https ://stackoverflow.com/a/53262717/1479414

假设我们有一个类:

public class Foo {
    private Integer x;

    public void setX(Integer x) {
       this.x = x;
    }

    public Integer getX() {
       return this.x;
    }
}

让我们考虑一个非常具体的场景,当我们只有两个与x变量交互的线程时:

在时间 1,创建线程 T1

在时间 2,T1 设置值:foo.setX(123);

在时间 3,创建了一个线程 T2

在时间 4,T2 读取值:foo.getX();

没有其他线程与此值交互。这两种操作只发生一次。

x所以在线程 T2 完成他的工作之前没有明显的值读取操作。

问题是:L缓存是否存在任何可以缓存变量null值的自动优化x,因此线程T2将读取其缓存值?换句话说,volatile在这种特殊情况下我们是否需要修饰符?

标签: javamultithreadingvolatilecpu-cache

解决方案


创建线程时,它会在创建之前看到任何设置的值。

在 Java 11 的 Javadoc for java.util.concurrency 下的Memory Visibility PropertiesJLS-17.4.5 for Java 8 states

在线程上启动的调用发生在已启动线程中的任何操作之前。

注意:线程仅读取缓存的值,当它重新读取缓存行中的值时,它已经在其缓存中。如果它读取以前从未读取过的缓存行或不再在缓存中,它将不会读取过时的值。


推荐阅读