我有一个关于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
做某事吗?
答案 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