【发布时间】:2019-04-15 06:12:17
【问题描述】:
坦率地说,这是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 值读取操作。
问题是:L 缓存是否存在任何自动优化,可以缓存x 变量的null 值,因此线程T2 将读取其缓存值?
换句话说,在这种特殊情况下,我们是否需要 volatile 修饰符?
【问题讨论】:
标签: java multithreading volatile cpu-cache