私はSun jdk 1.5 ThreadPoolExecutor(24、24,60、TimeUnit.SECONDS、新しいLinkedBlockingQueue())を使用しています。soemtime jdbツールを使用して、スレッドプール内のすべてのスレッドのステータスが「モニターで待機中」であることを確認します。コードは次のとおりです。
String key = getKey(dt.getPrefix(), id);
synchronized (key.intern()) { ----->
"synchronized (key.intern()) " に問題はありますか?
jdb ツールを使用して次の情報を取得します。24 スレッドのステータスは「モニターで待機中」です。これは、24 スレッドが「key.intern()」でデッドロックしていることを意味します。
(java.lang.Thread)0x28 pool-3-thread-2 モニターで待機中
(java.lang.Thread)0x27 pool-3-thread-3 モニターで待機中
(java.lang.Thread)0x1b pool-3-thread-4 モニターで待機中
(java.lang.Thread)0x1a pool-3-thread-5 モニターで待機中
(java.lang.Thread)0x19 pool-3-thread-6 モニターで待機中
(java.lang.Thread)0x18 pool-3-thread-7 モニターで待機中
(java.lang.Thread)0x17 pool-3-thread-8 モニターで待機中 ...
結果は次のとおりです。マルチスレッド環境では、Sting intern() メソッドがデッドロックになる可能性があります。