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 の行は、静的メソッドを参照しています。