I user sun jdk 1.5 ThreadPoolExecutor (24, 24,60, TimeUnit.SECONDS, новый LinkedBlockingQueue()). soemtime Я использую JDB инструмент для определения состояния всех потоков в пул потоков являются «ожидание в монитор», код:deadlock on synchronized (String intern())
String key = getKey(dt.getPrefix(), id);
synchronized (key.intern()) { ----->
Есть проблема в «синхронизированного (key.intern())»?
Я получаю следующее informatnio используя JDB инструмент, состояние 24 нитей «ждет в монитор», это означает, что 24 нити затор на «key.intern()».
(java.lang.Thread) 0x28 бассейн-3-нить-2 ожидания в мониторе
(java.lang.Thread) 0x27 бассейн-3-нить 3-ожидания в мониторе
(java.lang.Thread) 0x1b бассейн-3-нить 4-ожидания в мониторе
(java.lang.Thread) 0x1a бассейн-3-нить 5-ожидания в мониторе
(java.lang .Thread) 0x19 пул-3-нить-6, ожидающий на мониторе
(java.lang.Thread) 0x18 бассейн-3-нитка-7 ожидания в мониторе
(java.lang.Thread) 0x17 бассейн-3-нитка-8 ждет в мониторе ...
, поэтому результат: в среде с несколькими потоками, метод Sting intern() может быть тупиковым, ок?
Первым вопросом является то, что вы хотите достичь? В чем проблема? Зачем вам синхронизировать? – 2008-12-08 11:27:10
Вы смотрели темы OUTSIDE the threadpool, чтобы посмотреть, ждут ли они на мониторе? Вы должны обратить внимание на точный объект, который также синхронизируется с каждым потоком. – 2008-12-08 17:08:11
На мониторе есть две темы, выходящие за пределы потока, а также отслеживают одну и ту же строку (key.intern()). – user44230 2008-12-12 03:11:21