在 Java 多线程中使用 synchronized 关键字时没有得到想要的结果

Not getting desired result when using synchronized keyword in Java multithreading

我有两个文件,App.javaRunner.java

App.java -->

public class App {
    private static Thread thread1 = new Runner(1);
    private static Thread thread2 = new Runner(2);

    public static void main(String[] args) throws InterruptedException {
        thread1.start();
        thread2.start();

        thread1.join();
        thread2.join();

        System.out.printf("Count = %d\n", Runner.getCount());
    }
}

Runner.java -->

public class Runner extends Thread {
    private volatile static int count = 0;
    private int option = 0;

    private synchronized void increment() {
        count++;
    }

    private synchronized void decrement() {
        count--;
    }

    public Runner(int option) {
        this.option = option;
    }

    public static int getCount() {
        return count;
    }

    @Override
    public void run() {
        switch (option) {
            case 1:
                for (int i = 1; i <= 10000; i++) {
                    increment();
                }
                break;
            case 2:
                for (int i = 1; i <= 10000; i++) {
                    decrement();
                }
                break;
        }
    }
}

在这里,我试图从 main thread 创建两个 threads 并从两个线程访问一个公共 variable,其中 threads 将同时操纵这个普通的variable

我正在尝试为 synchronized 关键字的实施创建一个演示。

在我的示例中,在 Runner.java -

我正在 Runner class child class of Thread 使用 extends keywordoverriding正文中的run()method

接下来,我使用 constructor 获取 option 并 运行 在 switch - case run() 方法中使用相应的代码 block。公共变量是 countstatic 初始值为 0.

有两个methods,都使用synchronized keyword - increment()decrement()分别将count的值加1和减1 .

对于option 1 run() 方法使用for loop 到运行 increment() 10,000 次。 对于 option 2 run() 方法使用 for loop 到 运行 decrement() 10,000 次。

因此 count 的最终值应为 0。

App.java-

我正在创建两个 threads - thread1thread2,它们是 Runner class 的实例并传递 constructor argument 1 和 2分别。

我正在 运行使用 thread.start() 连接两个 threads 并等待使用 thread.join()

完成两个 threads

现在,我正在打印 count 的值。该值应为 0。但事实并非如此。在每次执行中它接近于 0 但不是 0。

那么,我哪里出错了,如何更正我的代码?

count 是静态的,意味着只有一个这样的变量。 incrementdecrement 都不是静态的,这意味着它们在 this 上同步 - 即两个单独的 Runner 实例。

将这些方法设为静态:

private synchronized static void increment() {
    count++;
}

private synchronized static void decrement() {
    count--;
}

或使用显式互斥对象:

private static int count = 0;
private static Object mutex = new Object;

private int option = 0;

private void increment() {
    synchronized (mutex) {
        count++;
    }
}

private void decrement() {
    synchronized (mutex) {
        count--;
    }
}