我们遇到了一个奇怪的问题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会将普