java - 自动优化对象变量的 L 缓存?

标签 java multithreading volatile cpu-cache

坦率地说,这是 this my question 的续篇,受此答案启发: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();

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

因此在线程 T2 完成其工作之前,没有明显的 x 值读取操作。

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

最佳答案

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

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

A call to start on a thread happens-before any action in the started thread.

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

关于java - 自动优化对象变量的 L 缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53263594/

相关文章:

multithreading - TOmniEventMonitor 可以在后台线程中使用吗?

java - 在 Java 中,我应该在 foreach 之前在本地复制一个 volatile 引用吗?

PostgreSQL 插入或更新触发函数波动类别

java - 文件写入器不工作?

Java 套接字客户端-服务器应用程序

python - 从线程停止 WxPython 应用程序的主循环需要窗口焦点

C++ 可变类型量词在变量定义中的位置

java - 我应该在 NPM 包中的哪里配置代码生成?

java - Android:状态栏的跳跃效果

ios - 异步+信号量与同步队列之间的区别