java - 我该如何解决这个明显的 EhCache 死锁?

标签 java deadlock ehcache

使用 ehCache 2.4.4,我似乎在 ehCache Segment 对象上陷入了僵局。从其他日志记录中,我知道“等待线程”1694 在生成此堆栈跟踪之前 9 小时最后一次运行任何东西。与此同时,1696 已经离开并做了很多其他工作,所以这把锁肯定是被错误持有的。

我非常有信心我没有直接直接锁定任何 Segment 实例,所以我认为这是库内部的某种问题。有什么想法吗?

"Model Executor - 1696" Id=1696 in TIMED_WAITING on lock=java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@92eb1ed
at sun.misc.Unsafe.park(Native Method)
at java.util.concurrent.locks.LockSupport.parkNanos(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(Unknown Source)
at java.util.concurrent.PriorityBlockingQueue.poll(Unknown Source)
at com.rtrms.application.modeling.local.BlockingTaskList.takeTask(BlockingTaskList.java:20)
at com.rtrms.application.modeling.local.ModelExecutor.executeNextTask(ModelExecutor.java:71)
at com.rtrms.application.modeling.local.ModelExecutor.run(ModelExecutor.java:46)

Locked synchronizers: count = 1
  - java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync@4a3d767f

"Model Executor - 1694" Id=1694 in WAITING on    lock=java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync@4a3d767f
 owned by Model Executor - 1696 Id=1696
at sun.misc.Unsafe.park(Native Method)
at java.util.concurrent.locks.LockSupport.park(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireShared(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireShared(Unknown Source)
at java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.lock(Unknown Source)
at net.sf.ehcache.store.compound.Segment.unretrievedGet(Segment.java:248)
at net.sf.ehcache.store.compound.CompoundStore.unretrievedGet(CompoundStore.java:191)
at net.sf.ehcache.store.compound.impl.DiskPersistentStore.containsKeyInMemory(DiskPersistentStore.java:72)
at net.sf.ehcache.Cache.searchInStoreWithStats(Cache.java:1884)
at net.sf.ehcache.Cache.get(Cache.java:1549)
at com.rtrms.amoeba.cache.DistributedModeledSecurities.get(DistributedModeledSecurities.java:57)
at com.rtrms.amoeba.modeling.AssertPersistedModeledSecurities.get(AssertPersistedModeledSecurities.java:44)
at com.rtrms.application.modeling.tasks.ExpandableModelingTask.getNextUnexecutedTask(ExpandableModelingTask.java:35)
at com.rtrms.application.modeling.local.BlockingTaskList.takeTask(BlockingTaskList.java:36)
at com.rtrms.application.modeling.local.ModelExecutor.executeNextTask(ModelExecutor.java:71)
at com.rtrms.application.modeling.local.ModelExecutor.run(ModelExecutor.java:46)

Locked synchronizers: count = 0   

最佳答案

事实证明,像 Cache.acquireWriteLockOnKey 这样的调用最终会获得对内部 Segment 的锁定,因此这种明显的死锁是由不在 finally block 中的 .unlock 调用引起的。

编辑评论:这也意味着您可能会在尝试锁定恰好位于同一段中的两个不同 key 时发生争用,这是非常不幸的。

关于java - 我该如何解决这个明显的 EhCache 死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8040156/

相关文章:

concurrency - Clojure: Agent calling Agent: 疑似死锁?

使用 sem_trywait() 会导致死锁

java - 寻找ehCache嵌入式服务器示例

java - 我的程序在 Eclipse 中运行良好,但作为 jar 文件运行时抛出异常

c# - 当线程使用调度程序并且主线程正在等待线程完成时出现死锁

java - JOptionPane.showMessageDialog() 显示但没有任何消息?

caching - 什么是拉通缓存?

java - 如何检查 Ehcache 2.10.x 中的过期条目

java - 并行转换流时如何使用收集器

java - 如何自动生成升序的数字?