Java 我不知道';我不理解同步在我的代码中是如何工作的

Java 我不知道';我不理解同步在我的代码中是如何工作的,java,multithreading,synchronization,Java,Multithreading,Synchronization,我有一个关于多线程和同步的问题。我创建了一个Runnable,它将用户输入的两个数字相加,但它们的输出是混合的 我已尝试在Runnable调用的方法上进行同步。这不起作用(我相信这与线程是不同的对象有关,因此没有使用相同的方法实例)。。。然后,我尝试在其中一个对象上进行同步,但也没有得到预期的结果 有人能解释一下发生了什么事吗?请参阅下面的代码: public static void main(String[] args) { Thread a = new Thread( new <

我有一个关于多线程和同步的问题。我创建了一个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(); 
    }
}
publicstaticvoidmain(字符串[]args){
螺纹a=新螺纹(新,简称“螺纹a”);
螺纹b=新螺纹(新,“螺纹b”);
已同步(a){
a、 start();
}
已同步(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>
线程A:
线程B:
线程B:
线程A:
线程A:
线程B:

我知道这个问题可以用join方法解决,但我也想知道同步失败的原因。这与我在
线程b
的同步过程中没有尝试对
线程a
执行某些操作有关吗?

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

publicstaticvoidmain(字符串[]args){
螺纹a=新螺纹(新,简称“螺纹a”);
螺纹b=新螺纹(新,“螺纹b”);
//同步所有线程调用“a.start()”
//但在本例中,只有主线程调用
//所以“同步”是不必要的
已同步(a){
a、 start();
}
//同步所有线程调用“b.start()”
//但在本例中,只有主线程调用
//所以“同步”是不必要的
已同步(a){
b、 start();
}
}
等于:

publicstaticvoidmain(字符串[]args){
螺纹a=新螺纹(新,简称“螺纹a”);
螺纹b=新螺纹(新,“螺纹b”);
a、 start();
b、 start();
}

请阅读以了解有关Java同步的更多信息。start()只会触发新线程并立即返回。因此,围绕它的
synchronized(a){..;}
语句没有意义,不会影响
run()
方法的工作方式。要同步,需要锁定一个公共对象。您可以尝试创建一个静态变量并在其上进行同步。此处的预期输出是什么?@Laurens:解释了您试图实现的行为?您是否希望第一个线程输入所需的数据,完成其工作,然后另一个线程开始输入?或者你期待其他的“门塔勒格”,这确实是你想要的行为。我主要感到困惑的是,为什么上面的代码没有完成这一点,答案是“另一个人”。