java - 为什么这没有正确同步?

标签 java multithreading synchronization synchronized

大家好,我有这段代码:

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 之后添加一个 Thread.sleep(1)。 start() 我总是得到想要的结果 120。为什么会这样?

这真的让我很困惑,如果能得到任何帮助,我将不胜感激,谢谢

最佳答案

您在启动所有线程之后打印计数器的值,而不是在所有线程完成之后。

在您开始等待的所有线程上使用 Thread.join() 直到它们完成,然后打印值。或者使用 CountDownLatch。 sleep 会意外地给你正确的结果。它允许所有线程完成,但这只是因为它们要做的事情很少,所以 hibernate 1 毫秒就足够了。

关于java - 为什么这没有正确同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16490526/

相关文章:

java - 找不到类 JsonObject

java - 创建一个显示 "Please Wait"JDialog 的 swing 线程

Python 和 C/C++ 多线程 : run several threads executing python in the background of C

java - 在锁定对象上同步与在处理的对象上同步

java - Reactor 有没有办法忽略错误信号?

java - 很奇怪的OutOfMemoryError

c++ - -> must point to class/struct/union/generic 类型错误

php - 服务器能否在用户不知情的情况下将更改通知 iOS/Android 应用程序?

c# - 将列表与列表框同步?

java - 在获取特定数据集的 BQ 表列表时获取 AppIdentityServiceFailureException getAccessToken