我不了解代码中同步的工作原理

时间:2019-12-23 23:54:01

标签: java multithreading synchronization

我有一个关于multythreading,特别是同步的问题。我创建了一个Runnable,将用户输入的两个数字相加,但它们的输出混合在一起。

我已经尝试过对Runnable调用的方法进行同步。这是行不通的(我认为这与线程是不同的对象有关,因此没有使用方法的相同实例)...然后我尝试在其中一个对象上进行同步,但这也没有给出期望的结果结果。

有人可以解释发生了什么吗?请参见下面的代码:

public static void main(String[] args) {
    Thread a = new Thread( new <CLASSNAME>, "Thread A"); 
    Thread b = new Thread( new <CLASSNAME>, "Thread B"); 

    synchronized (a) {
        a.start(); 
    }
    synchronized (a) {
        b.start(); 
    }
}

这给出类似

的结果
Thread A: <INPUT PROMPT 1>
Thread B: <INPUT PROMPT 1>
Thread B: <INPUT PROMPT 2>
Thread A: <INPUT PROMPT 2>

Thread A: <OUTPUT>
Thread B: <OUTPUT>

我知道可以使用join方法解决此问题,但是我也想知道为什么同步失败。我实际上并没有尝试在Thread a的同步中尝试使用Thread b做某事吗?

1 个答案:

答案 0 :(得分:0)

我已经在您的代码中添加了一些注释来解释:

public static void main(String[] args) {
        Thread a = new Thread( new <CLASSNAME>, "Thread A");
        Thread b = new Thread( new <CLASSNAME>, "Thread B");

        // synchronize all threads call 'a.start()'
        // but in this case, only main thread call
        // so 'synchronized' is unnecessary
        synchronized (a) {
            a.start();
        }

        // synchronize all threads call 'b.start()'
        // but in this case, only main thread call
        // so 'synchronized' is unnecessary
        synchronized (a) {
            b.start();
        }
}

等于:

public static void main(String[] args) {
        Thread a = new Thread( new <CLASSNAME>, "Thread A");
        Thread b = new Thread( new <CLASSNAME>, "Thread B");

        a.start();
        b.start();
}

请阅读this guide,以详细了解Java Synchronization