当前位置: 首页 > 面试题库 >

ConcurrentHashMap是否有可能“死锁”?

赵明亮
2023-03-14
问题内容

我们遇到了一个奇怪的问题ConcurrentHashMap,其中似乎有两个线程正在调用put(),然后在方法内部永远等待Unsafe.park()。从外部看,内部看起来像是一个僵局ConcurrentHashMap

到目前为止,我们只看到这种情况发生一次。

谁能想到任何可能导致这些症状的东西?

编辑 :相关线程的线程转储在这里:

“ [已编辑]线程2” prio = 10 tid = 0x000000005bbbc800 nid = 0x921等待条件[0x0000000040e93000]
   java.lang.Thread.State:等待(停车)
    在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:等待(停车)
    在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)
    于[删除]

问题答案:

可能不是您想要的答案,但这可能是JVM错误。看到

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6865591



 类似资料:
  • 问题内容: 从技术上讲,Java中的线程自身可能死锁吗? 不久前,我在一次采访中被问到这是不可能的,但采访者告诉我这是可能的。不幸的是,我无法获得他的方法来解决这种僵局。 这让我开始思考,我唯一能想到的就是发生这种情况的地方是您拥有一个RMI服务器进程,其中包含一个调用自身的方法。调用该方法的代码行放置在同步块中。 甚至有可能还是面试官不正确? 我一直在考虑的源代码遵循这些原则(其中testDea

  • 问题内容: 任何Throwable都可以被捕获 输出: 因此,如果在初始化块期间做不好的事情,我希望能够捕获ExceptionInInitializerError。但是,以下操作无效: 输出: 并且如果我更改代码以另外捕获ArrayIndexOutOfBoundsException 被捕获的是ArrayIndexOutOfBoundsException: 谁能告诉我为什么呢? 问题答案: 顾名思义

  • 问题内容: 拿这个对象: 如果我这样做: 然后y将返回。通过stringify传递函数有什么能做的吗?使用“ ye goode olde eval()”可以创建具有附加功能的对象,但是打包该对象又是什么呢? 问题答案: 您不能打包函数,因为任何序列化程序都看不到函数关闭的数据。甚至Mozilla 也无法正确打包闭包。 最好的选择是使用复活器和替换器。 https://yuilibrary.com/

  • seata版本:1.4.0,但1.4以下的所有版本也都有这个问题 问题描述:在一个全局事务中,一个分支事务上的纯查询操作突然卡住了,没有任何反馈(日志/异常),直到消费端RPC超时 问题排查 整个流程在一个全局事务中,消费者和提供者可以看成是全局事务中的两个分支事务,消费者 --> 提供者 消费者先执行本地的一些逻辑,然后向提供者发送RPC请求,确定消费者发出了请求已经并且提供者接到了请求 提供者

  • 我对高级Java没有经验,所以请原谅我。 我对Java实现可以称为“自主”的特性的能力很好奇。假设我们有两个Java程序在运行。一个程序确定另一个程序占用内存,因此杀死该程序和/或为JVM分配更多内存。

  • 问题内容: 在我们的应用程序中,我们需要具有只能分配一次的字段。 最初,我们想到封装字段并将设置程序设为私有。但是,引起一些问题: 如果没有公共设置者,Hibernate是否仍然可以从数据库映射字段? 我是否可以剥离设置器并使字段仅在实体构造函数中可变? 最后,是否有任何标准的JPA方法使字段不变? 提前致谢。 问题答案: 广告。1:我相信,如果将注释放在字段而不是在getter上,则JPA会将普