java - 对象变量的 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
在这种特殊情况下我们是否需要修饰符?
解决方案
创建线程时,它会在创建之前看到任何设置的值。
在 Java 11 的 Javadoc for java.util.concurrency 下的Memory Visibility Properties和JLS-17.4.5 for Java 8 states
在线程上启动的调用发生在已启动线程中的任何操作之前。
注意:线程仅读取缓存的值,当它重新读取缓存行中的值时,它已经在其缓存中。如果它读取以前从未读取过的缓存行或不再在缓存中,它将不会读取过时的值。
推荐阅读
- objective-c - 从 Objective-C 桥接到 swift 时,swift 编译器如何识别变量是复制的还是强的?
- cakephp - CakePHP 升级 3.3.16 > 3.6.7 后“_cake_model_”缓存配置不存在
- python - 阿伦森的序列
- javascript - 如何使用js在jsp页面加载时调用servlet页面
- r - 如何将 R 坐标列表插入 rmapshaper 以创建多边形
- android - 使按钮启用和禁用一段时间
- aem - AEM 客户端库在 JS/CSS 版本之间切换
- c# - 解析值时遇到意外字符:[。路径“数据”,第 1 行,位置 26
- oracle - PLSQL 过程语法
- node.js - 更新数组中的多个元素