gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:00:45 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com