我正在尝试了解线程。 我写了简单的程序。
public class Main {
static int counter = 0;
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter++;
}
});
Thread t2 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter++;
}
});
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(counter);
}
}
结果始终为2000,但我不知道为什么。任何运行方法都不同步,因此为什么它总是给我相同的结果。
如果我写:
t1.start();
t1.join();
System.out.println(counter);
t2.start();
System.out.println(counter);
然后我得到结果:1000,1000。为什么总是等于1000?
答案 0 :(得分:7)
循环太短了,t1
在t2
开始之前就结束了。尝试100,000。缺少同步并不能保证您会遇到并发问题,但是正确地合并同步可以防止这些问题。
答案 1 :(得分:5)
结果总是2000,但是我不知道为什么。
因为您很幸运在两个线程之间没有任何竞争状况。仅仅因为发生种族状况 并不意味着就可以保证发生。
为什么总是等于1000?
因为第二次打印计数器时第二个线程尚未执行。或者是因为它已经执行,但是由于缺乏同步而没有可见性保证,因此主线程仍然可以看到最新值。