gpt4 book ai didi

java - 这段代码不是线程安全的吗?

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

我期望这段代码是线程安全的。我运行了几次,但得到了不同的结果。但是,如果我取消注释 sleep(1000) 部分,它每次都会打印 10000(至少从我的测试运行的结果来看)。

那怎么了?这可能与thread.join()有关吗?

public class Test implements Runnable{

private int x;

public synchronized void run(){
x++;
}

public static void main(String args[]){
Test test = new Test();
Thread thread = null;
for (int i = 0; i < 10000; i++) {
thread = new Thread(test);
try {
thread.join();
} catch (InterruptedException e) {}
thread.start();
}
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
System.out.println(test.x);
}
}

编辑:哎呀,我的错。我误解了 Thread#join 的功能。在 run() 方法上同步是一个坏主意。

最佳答案

thread.join()应该在 thread.start() 之后调用.

join() 表示“阻塞直到线程完成”。这只有在线程启动后才有意义。

大概您的 Thread.sleep() 调用实际上等待了足够长的时间,以便所有线程(您实际上没有加入)完成。如果没有它,当您打印出 x 的值时,线程可能尚未全部完成。

关于java - 这段代码不是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35135663/

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