【问题标题】:I don't understand how synchronization works in my code我不明白同步在我的代码中是如何工作的
【发布时间】: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


【解决方案1】:

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

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的更多信息

【讨论】:

    猜你喜欢
    • 2021-11-03
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    相关资源
    最近更新 更多