gpt4 book ai didi

java - 两个线程访问同一个变量锁应用程序

转载 作者:行者123 更新时间:2023-12-01 11:30:24 26 4
gpt4 key购买 nike

以下代码总结了应用程序,应用程序随机被锁定

while (flag)

这段代码在我的机器上运行被捕获,在另一台机器上他正常完成

此处生成的输出是:

INIT
END
before while
before flag
after flag

代码:

package threads;

public class Run implements Runnable {

private Thread thread;
private boolean flag = true;

public void init() {
thread = new Thread(this);
thread.setName("MyThread");
thread.start();
}

@Override
public void run() {
try {

int i = 0;
while (i < 1000) {
i++;
}
System.out.println("before flag");
flag = false;
System.out.println("after flag");

} catch (Exception e) {
e.printStackTrace();
} finally {
flag = false;
}
}

public void end() {
thread.interrupt();
thread = null;

System.out.println("before while");
while (flag) {
// try { Thread.sleep(100);} catch (InterruptedException e) {}
}
;
System.out.println("after while");
}

public static void main(String[] args) {
Run r = new Run();
System.out.println("INIT");
r.init();
System.out.println("END");
r.end();
}
}

为什么当我更改flag的值时,主线程不通过循环?

最佳答案

改变

private boolean flag = true;

private volatile boolean flag = true;

如果没有 volatile ,就无法保证等待线程需要看到值已更新。 HotSpot如果循环旋转足够多次,甚至可能将 while(flag) 内联到 while(true)

参见Memory Consistency Errors .

<小时/>

此外,您正在做的事情称为 spinlock 。通常你应该使用 thread.join()反而。自旋锁浪费资源,因为等待线程在它应该等待的整个时间里实际上都在工作(检查变量)。

关于java - 两个线程访问同一个变量锁应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30444347/

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