首页 > 解决方案 > 同步不会阻止并发

问题描述

我在java中的多线程方面非常新手,所以如果有人给我简要解释以下内容,我将不胜感激:

这是我的代码:

public class Lesson6 {
    private static volatile Long value = 0L;

    public static void main(String[] args) throws InterruptedException {
        Thread inc = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 100_000; i++) {
                    synchronized (this){
                        ++value;
                    }
                }
            }
        });
        inc.start();

        Thread dec = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 100_000; i++) {
                    synchronized (this){
                        --value;
                    }
                }
            }
        });
        dec.start();

        inc.join();
        dec.join();

        System.out.println(value);
    }
}

在我看来,输出应该为零,但它永远不会为零。调试器显示,随着 run() 方法的运行,THIS 总是会有所不同。为什么会这样?

谢谢。

标签: javaconcurrencysynchronization

解决方案


调试器显示,随着 run() 方法的运行,这总是不同的

每个new Runnable都是不同的对象,因此this在每种情况下都是不同的。

如果您使用通用对象,该程序应该可以工作。

顺便说一句,我建议对值使用原语long而不是对Long

public class Lesson6 {
    private static volatile long value = 0L;

    public static void main(String[] args) throws InterruptedException {
        final Object locked = new Object();
        Thread inc = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 100_000; i++) {
                    synchronized (locked){
                        ++value;
                    }
                }
            }
        });
        inc.start();

        Thread dec = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 100_000; i++) {
                    synchronized (locked){
                        --value;
                    }
                }
            }
        });
        dec.start();

        inc.join();
        dec.join();

        System.out.println(value);
    }
}

印刷

0

推荐阅读