【发布时间】: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