gpt4 book ai didi

java - Java将线程缓存刷新到实际副本时

转载 作者:行者123 更新时间:2023-12-03 13:14:13 24 4
gpt4 key购买 nike

我读了几篇有关 volatile 线程缓存的文章,发现没有示例就太简短了,因此对于初学者来说很难理解。

请帮助我理解以下程序,

public class Test {
int a = 0;
public static void main(String[] args) {
final Test t = new Test();
new Thread(new Runnable(){
public void run() {
try {
Thread.sleep(3000);
} catch (Exception e) {}
t.a = 10;
System.out.println("now t.a == 10");
}
}).start();

new Thread(new Runnable(){
public void run() {
while(t.a == 0) {}
System.out.println("Loop done: " + t.a);
}
}).start();
}

}

当我使 a变量 volatile并运行我的程序时,它会在一段时间后停止,但是当我将 volatile删除为 a变量时,它会继续运行,并且我的程序不会停止。

我对volatile的了解是“当变量声明为volatile时,线程将直接读取/写入变量内存,而不是从本地线程缓存读取/写入。
如果未声明为volatile,则可以看到更新实际值的延迟。”

另外,根据我对刷新缓存副本的了解,我认为程序会在一段时间后停止,但是为什么在上面的程序中它会继续运行而不更新。

那么,何时线程引用其本地缓存开始引用主副本或使用主副本值刷新其值?

如果我的理解有误,请纠正我。

请用一些小的代码段或链接向我解释。

最佳答案

when variable is declared as volatile then thread will directly read/write to variable memory instead of read/write from local thread cache. if not declared volatile then one can see delay in updation of actual value.



首先,以上陈述是错误的。在机器代码级别上还有许多其他现象与“线程局部变量缓存”无关。实际上,这个概念根本不适用。

为了给您一些特定的重点,将允许JIT编译器转换您的代码
while(t.a == 0) {}

进入
if (t.a == 0) while (true) {}

每当 t.a不是 volatile时。 Java内存模型允许将数据争用中访问的任何变量视为访问线程是存在的唯一线程。由于显然该线程没有修改 t.a,因此可以将其值视为循环不变,并且不必重复检查。

关于java - Java将线程缓存刷新到实际副本时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22013353/

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