тупик при синхронизации (String intern ()) - PullRequest
6 голосов
/ 08 декабря 2008

Я пользователь sun jdk 1.5 ThreadPoolExecutor (24, 24,60, TimeUnit.SECONDS, новый LinkedBlockingQueue ()). Так вот, я использую инструмент jdb, чтобы найти состояние всех потоков в пуле потоков, «ожидающих на мониторе», код:

    String key = getKey(dt.getPrefix(), id);
    synchronized (key.intern()) {      ----->

Есть ли проблема в "synchronized (key.intern ())"?


Я получаю следующую информацию, используя инструмент jdb, 24 потока находятся в состоянии ожидания на мониторе, это означает, что 24 потока зашли в тупик при key.intern ().

(java.lang.Thread) 0x28 пул-3-нить-2, ожидающий в мониторе

(java.lang.Thread) 0x27 пул-3-нить-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 () может быть тупиковым, хорошо?

Ответы [ 11 ]

0 голосов
/ 08 декабря 2008

key.intern () гарантирует уникальность, потому что key.intern () возвращает строку из пула констант String.

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#intern() стажер

public String intern () Возвращает каноническое представление для строкового объекта. Пул строк, изначально пустой, поддерживается частным образом классом String.

...