24

ConcurrentHashMap2 つのスレッドが を呼び出しput()、メソッド内で永久に待機しているように見えるという奇妙な問題に遭遇しましたUnsafe.park()。外側から見ると、内部は行き詰まりのように見えますConcurrentHashMap

これまでのところ、これが発生したのは 1 回だけです。

これらの症状を引き起こす可能性のある何かを考えられる人はいますか?

編集: 関連するスレッドのスレッド ダンプは次のとおりです。

"[編集済み] スレッド 2" prio=10 tid=0x000000005bbbc800 nid=0x921 条件 [0x0000000040e93000] で待機中
   java.lang.Thread.State: WAITING (パーキング)
    at sun.misc.Unsafe.park(ネイティブメソッド)
    - <0x00002aaaf1207b40> を待機するパーキング (java.util.concurrent.locks.ReentrantLock$NonfairSync)
    java.util.concurrent.locks.LockSupport.park(LockSupport.java:158) で
    java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt (AbstractQueuedSynchronizer.java:747) で
    java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued (AbstractQueuedSynchronizer.java:778) で
    java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire (AbstractQueuedSynchronizer.java:1114) で
    java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:186) で
    java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:262) で
    java.util.concurrent.ConcurrentHashMap$Segment.put(ConcurrentHashMap.java:417) で
    java.util.concurrent.ConcurrentHashMap.put (ConcurrentHashMap.java:883) で
    [編集済み]


"[編集済み] スレッド 0" prio=10 tid=0x000000005bf38000 nid=0x91f 条件 [0x000000004151d000] で待機中
   java.lang.Thread.State: WAITING (パーキング)
    at sun.misc.Unsafe.park(ネイティブメソッド)
    - <0x00002aaaf1207b40> を待機するパーキング (java.util.concurrent.locks.ReentrantLock$NonfairSync)
    java.util.concurrent.locks.LockSupport.park(LockSupport.java:158) で
    java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt (AbstractQueuedSynchronizer.java:747) で
    java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued (AbstractQueuedSynchronizer.java:778) で
    java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire (AbstractQueuedSynchronizer.java:1114) で
    java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:186) で
    java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:262) で
    java.util.concurrent.ConcurrentHashMap$Segment.put(ConcurrentHashMap.java:417) で
    java.util.concurrent.ConcurrentHashMap.put (ConcurrentHashMap.java:883) で
    [編集済み]
4

3 に答える 3

4

あなたが望む答えではないかもしれませんが、これは JVM のバグかもしれません。JDK 6865591を参照してください。

Test6471091.java が Solaris-i586 でハングする

于 2010-07-20T18:43:44.117 に答える
3

パッケージ Unsafe はネイティブであり、実装はプラットフォームに依存します。

マップ上のロックを取得した 3 番目のスレッド (プラットフォーム レベルでは、例外は問題ではありません) が突然終了すると、このような状況が発生する可能性があります - ロックの状態が壊れ、他の 2 つのスレッドが無効になり、誰かが Unsafe.unpark() を呼び出すのを待っています (そして、それは決して起こりません)。

于 2010-07-21T00:58:35.377 に答える