gpt4 book ai didi

java - 是否为线程更新了公共(public)静态变量? (它是线程安全的吗?)

转载 作者:行者123 更新时间:2023-11-29 06:41:11 24 4
gpt4 key购买 nike

我尝试了以下方法,但没有用:

“开始”类:

public class Start implements Runnable {

Start start;
LoadExample loadExample;
Thread mainThread;
Thread loadExampleThread;

private boolean running = false;
public static boolean isExampleLoaded = false;

public static void main(String[] args) {
begin = new Start();
loadExample = new LoadExample();
begin.start();
}

public synchronized void start() {
mainThread = new Thread(this, "Main");
mainThread.start();
loadExampleThread = new Thread(loadExample, "Load Example");
loadExampleThread.start();
}

public void run() {
running = true;
while (running) {
if(isExampleLoaded){
System.out.println("Loaded!");
}
}
}
}

“LoadExample”类:

public class LoadExample implements Runnable {

public void run(){
//blabla, loading if you will...
Start.isExampleLoaded = true;
}
}

您可能会在上面的代码中发现语法错误,但这只是因为我没有在 Eclipse 中检查就输入了这个。我的原始代码非常相似,Eclipse 没有显示任何错误或警告。

我的问题是代码不会打印“已加载!”。我认为这是因为 (1) 线程不能更改静态变量或其他类的变量,或者 (2) 更改仅更新当前线程而不更新其他线程,但我可能错了。

如有任何澄清,我们将不胜感激。

编辑:

如果您发现上述任何错误,请告诉我,我会尽快更新。

最佳答案

您需要标记变量 volatile 才能使该示例正常工作。如果没有 volatile,读取线程将读取一次 isExampleLoaded,并且不会再次读取它,因为编译器知道该变量尚未写入。

关于java - 是否为线程更新了公共(public)静态变量? (它是线程安全的吗?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11805224/

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