我用户sun jdk 1.5 ThreadPoolExecutor(24,24,60,TimeUnit.SECONDS,new 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()方法可能会死锁,好吗?
解决方法
我曾经发过一个相关的问题,你可能想看一下:
Problem with synchronizing on String objects?
我学到的是:使用intern’ed Strings进行同步是一种不好的做法.