作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我期望这段代码是线程安全的。我运行了几次,但得到了不同的结果。但是,如果我取消注释 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/
我是一名优秀的程序员,十分优秀!