大家好,我有这段代码:
public class ThreadTester {
public static void main(String args[]) {
Counter c = new Counter();
for (int i = 0; i < 10; i++) {
MyThread a = new MyThread(c);
MyThread b = new MyThread(c);
a.start();
b.start();
}
System.out.println("The value of the balance is " + c.getVal());
}
}
class MyThread extends Thread {
private Counter c;
public MyThread(Counter c){ this.c = c; }
public void run(){ s.increment(); }
}
class Counter {
private int i = 100;
public synchronized void increment(){ i++; }
public synchronized int getVal(){ return i; }
}
现在我认为这应该给出所需的结果 120 - 然而结果似乎在 115 和 120 之间波动。如果我在 b 之后添加一个
我总是得到想要的结果 120。为什么会这样?Thread.sleep(1)
。 start()
这真的让我很困惑,如果能得到任何帮助,我将不胜感激,谢谢
最佳答案
您在启动所有线程之后打印计数器的值,而不是在所有线程完成之后。
在您开始等待的所有线程上使用 Thread.join() 直到它们完成,然后打印值。或者使用 CountDownLatch。 sleep 会意外地给你正确的结果。它允许所有线程完成,但这只是因为它们要做的事情很少,所以 hibernate 1 毫秒就足够了。
关于java - 为什么这没有正确同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16490526/