【发布时间】:2019-12-23 23:54:01
【问题描述】:
我有一个关于多线程特别是同步的问题。我创建了一个 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 b 的同步中尝试对Thread a 做某事这一事实有任何关系?
【问题讨论】:
-
a.start()只会触发新线程并立即返回。因此,它周围的synchronized(a) { ..; }语句是没有意义的,不会影响run()方法的工作原理。 -
要同步,您需要锁定一个公共对象。您可以尝试创建一个静态变量并在其上进行同步
-
这里的预期输出是什么?
-
@Laurens:向我们解释你想要实现什么行为?您是否希望第一个线程输入所需的数据,完成其工作,然后另一个线程开始输入?还是你期待别的什么?
-
@mentallurg 这确实是预期的行为。我主要是困惑为什么上面的代码没有完成,这是由“那个人”回答的。
标签: java multithreading synchronization