java两个线程如何同时锁定同一个对象?
我正在写一个多线程程序来打印从1到n的数字
我有两个线程,它有一个输出Odd
编号的运行程序。和一个线程,该线程有一个输出Even
编号的转轮
while (true) {
synchronized (ng) {
while (ng.getData() % 2 == 1) {
try {
ng.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
ng.increment();
ng.notify();
}
我已将调试点放在同步方法中。附加快照:
在名为notify()
的第一个线程之后,在debug选项卡中,它仍然显示
owns NumberGenerator
您可以在快照中看到:
它说有两个线程:线程1和线程2拥有NumberGenerator对象强>
两个线程如何同时持有对象上的锁
# 1 楼答案
两个线程不可能同时持有同一个锁。这可能是因为两个线程在调试器中显示的数据之间交换了锁。例如,调试器将获取线程1的数据,然后线程1释放锁,然后由线程2获取锁,调试器将获取线程2的数据。这将使两个线程似乎同时拥有锁。这个问题的答案很好地解释了这一点:Multiple threads hold the same lock?
但我同意埃利奥特的观点,如果你只想把数字1打印到n,一个for循环就是最好的选择。但是,如果你想学习线程是如何工作的,拥有两个线程可能是一个很好的练习