【问题标题】:How could 2 Threads lock on the same object at same time?2个线程如何同时锁定同一个对象?
【发布时间】:2018-02-26 02:31:52
【问题描述】:

我正在编写一个多线程程序来打印从 1 到 n 的数字。

我有 2 个线程,其中有一个打印 Odd 号码的跑步者。以及 1 个线程,其中包含一个打印 Even 编号的跑步者。

while (true) {              
            synchronized (ng) {                 
                while (ng.getData() % 2 == 1) {
                    try {
                        ng.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                ng.increment();
                ng.notify();
}

我已将调试点放在同步方法中。附上快照:

在名为notify() 的第一个线程之后,在调试选项卡中,它仍然显示

owns NumberGenerator

你可以在快照中看到:

上面写着 2 个线程:Thread-1 和 Thread-2 拥有 NumberGenerator 对象。

两个线程如何同时持有一个对象的锁?

【问题讨论】:

  • 如果要按顺序打印数字1到n,不要使用多个线程来做!
  • 你的意思是我应该使用for loop,对吧?
  • 或者你可以使用并行流:)
  • 我的意思是它是顺序任务的定义,使并行应用程序按顺序运行没有任何好处 - 并且运行并行作业是有成本的。这是阿姆达尔定律的直接结果。
  • 不太熟悉这个,因为有这么多好的库可以保护我们不必自己编写这种代码,但是..你不应该从synchronized 内部notify()堵塞?我能找到的所有示例都使用该模式,但您在 synchronized 块之外有 notify()。这会导致问题吗?

标签: java multithreading debugging runnable synchronized


【解决方案1】:

两个线程不可能同时持有同一个锁。这可能是由于两个线程在调试器中显示的数据之间交换了锁。因此,例如,调试器将获取线程 1 的数据,然后线程 1 释放锁,然后由线程 2 获取,然后调试器获取线程 2 的数据。这看起来两个线程都有同时锁。这个问题的答案很好地解释了它:Multiple threads hold the same lock?

但我同意 Elliot 的观点,如果您只想将数字 1 打印到 n,那么 for 循环是可行的方法。但是如果你想了解线程是如何工作的,拥有两个线程可能是一个很好的练习

【讨论】:

  • 这看起来像是学习synchronizednotify()wait() 的练习。以正确的方式做事可能不如以教育的方式做重要:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多