在我们的 java 应用程序启动过程中,我们遇到了一个奇怪的死锁。当我在应用程序上运行 jstack 进行调查时,我看到 AWT-EventQueue 在 Object.wait() 中,但线程仍被标记为 RUNNABLE。我已经包含了线程转储的相关部分,我希望有人可以对这个问题有所了解。
"AWT-EventQueue-0" prio=6 tid=0x5f0a2400 nid=0x19e4 in Object.wait() [0x6007e000]
java.lang.Thread.State: RUNNABLE
at com.ge.med.platinum.work.isu.ExamTransaction.getEAOTableLite(ExamTransaction.java:1514)
...
- locked <0x1fc87448> (a java.awt.Component$AWTTreeLock)
...
"Thread-63-Pool-9" prio=6 tid=0x5f1a2800 nid=0x1f54 waiting for monitor entry [0x61a9f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.awt.Component.setFont(Component.java:1777)
- waiting to lock <0x1fc87448> (a java.awt.Component$AWTTreeLock)
...
"Thread-289-Pool-3" prio=6 tid=0x60afe800 nid=0x12b8 waiting for monitor entry [0x623fe000]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.awt.Component.setFont(Component.java:1777)
- waiting to lock <0x1fc87448> (a java.awt.Component$AWTTreeLock)
...
另外,我注意到这个线程,其中提到可能涉及访问静态变量。在我们的应用程序中也是如此。有问题的 getEAOTableLite 中的行引用了一个静态方法。