【发布时间】:2015-05-07 21:19:38
【问题描述】:
我有以下线程转储,它显示两个线程都锁定在同一个对象上。我对它的真正含义感到困惑
"pool-1-thread-2" prio=10 tid=0x00007fd6dc106000 nid=0x5d15 in Object.wait() [0x00007fd6d2067000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007c3547770> (a java.lang.Object)
at java.lang.Object.wait(Object.java:503)
at test.TestDead$Foo.second(TestDead.java:22)
at test.TestDead$Foo.first(TestDead.java:14)
- locked <0x00000007c3547770> (a java.lang.Object)
at test.TestDead$2.run(TestDead.java:45)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Locked ownable synchronizers:
- <0x00000007c35519e8> (a java.util.concurrent.ThreadPoolExecutor$Worker)
"pool-1-thread-1" prio=10 tid=0x00007fd6dc104800 nid=0x5d14 in Object.wait() [0x00007fd6d2168000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007c3547770> (a java.lang.Object)
at java.lang.Object.wait(Object.java:503)
at test.TestDead$Foo.second(TestDead.java:22)
at test.TestDead$Foo.first(TestDead.java:14)
- locked <0x00000007c3547770> (a java.lang.Object)
at test.TestDead$1.run(TestDead.java:37)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
atjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Locked ownable synchronizers:
- <0x00000007c3551730> (a java.util.concurrent.ThreadPoolExecutor$Worker)
“锁定”在这里的真正含义是什么?
【问题讨论】:
-
感谢您的链接。这正是我在转向 StackOverflow 之前阅读的页面。
-
你能显示整个堆栈跟踪吗?如果其中一个正在等待,两个线程可以持有相同的锁。
-
@Banthar 帖子已更新。你能解释一下两个线程持有同一个锁吗?我只是不明白。我认为“锁”应该由一个且只有一个线程持有。谢谢
-
由于
wait()是本机方法,我的猜测是wait()解锁监视器的事实不会在线程转储中报告。因此,两个线程都锁定了监视器并调用wait(它在内部将其解锁),但它仍然在线程转储中显示为锁定。
标签: java multithreading jvm thread-dump