坦率地说,这是 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 Properties和 JLS-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/