有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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();
}

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

enter image description here 在名为notify()的第一个线程之后,在debug选项卡中,它仍然显示

owns NumberGenerator

您可以在快照中看到:

它说有两个线程:线程1和线程2拥有NumberGenerator对象

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


共 (1) 个答案

  1. # 1 楼答案

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

    但我同意埃利奥特的观点,如果你只想把数字1打印到n,一个for循环就是最好的选择。但是,如果你想学习线程是如何工作的,拥有两个线程可能是一个很好的练习