【发布时间】:2010-09-25 19:50:31
【问题描述】:
我用户 sun jdk 1.5 ThreadPoolExecutor(24, 24,60,TimeUnit.SECONDS, new LinkedBlockingQueue())。 soemtime我使用jdb工具查找线程池中所有线程的状态都是“在监视器中等待”,代码是:
String key = getKey(dt.getPrefix(), id);
synchronized (key.intern()) { ----->
“同步的(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() 方法可能会死锁,好吗?
【问题讨论】:
-
第一个问题是你想达到什么目标?问题是什么?为什么需要同步?
-
您是否查看过线程池外的线程以查看它们是否也在监视器中等待?您还应该注意每个线程同步的确切对象。
-
线程池外有两个线程在一个monitor上等待,同时也在监听同一行(key.intern())。
-
在实习字符串中同步根本不起作用。它不保证在不同的线程中返回相同的字符串对象,因为与实习生操作没有“发生在之前”的关系。因此,这两个线程具有不同的实习字符串表,直到它们通过同一对象上的监视器(或以其他方式建立“发生在之前”) identityHashCode() 但相同的字符串值......它发生了大约 1/3 的时间(在这种情况下)。
标签: java string deadlock synchronized string-interning