use*_*230 7 java string deadlock synchronized string-interning
我用户sun jdk 1.5 ThreadPoolExecutor(24,24,60,TimeUnit.SECONDS,new LinkedBlockingQueue()).soemtime我使用jdb工具查找线程池中所有线程的状态是"在监视器中等待",代码是:
String key = getKey(dt.getPrefix(), id);
synchronized (key.intern()) { ----->
Run Code Online (Sandbox Code Playgroud)
"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()方法可能会死锁,好吗?
我曾经发过一个相关的问题,你可能想看一下:在String对象上同步的问题?
我学到的是:使用intern'ed Strings进行同步是一种不好的做法.
相当。问题是 key.intern() 并不是那么唯一,因为它从池中返回一个字符串。即使在不同的对象上使用 String.intern() 也可能返回相同的对象。尝试使用key它本身或完全不同的对象。
| 归档时间: |
|
| 查看次数: |
8561 次 |
| 最近记录: |