什么可能导致程序在它看起来拥有的监视器上被阻止?

时间:2011-09-20 20:21:09

标签: java multithreading locking json-lib apache-commons-beanutils

我最近遇到了三个运行相同代码的单独服务器出现相同症状的问题。这些是使用json-lib创建JSON响应的高容量REST / JSON服务器。服务器最终都会挂起,大多数线程都在等待一个特定的锁。持有该锁的线程具有相同的基本外观:

 "TP-Processor204" daemon prio=10 tid=0x00002aac40d85000 nid=0x6978 waiting for monitor entry [0x000000004dec8000] 
    java.lang.Thread.State: BLOCKED (on object monitor)
        at org.apache.commons.beanutils.BeanUtilsBean.getInstance(BeanUtilsBean.java:78)
        - locked <0x00002aaab230f970> (a java.lang.Class for org.apache.commons.beanutils.BeanUtilsBean)
        at org.apache.commons.beanutils.PropertyUtilsBean.getInstance(PropertyUtilsBean.java:101)
        at org.apache.commons.beanutils.PropertyUtils.getProperty(PropertyUtils.java:290)
        at net.sf.json.JSONObject._fromBean(JSONObject.java:918)
        at net.sf.json.JSONObject.fromObject(JSONObject.java:168)
        at net.sf.json.AbstractJSON._processValue(AbstractJSON.java:265)
        at net.sf.json.JSONArray._processValue(JSONArray.java:2514)
        at net.sf.json.JSONArray.processValue(JSONArray.java:2539)
        at net.sf.json.JSONArray.addValue(JSONArray.java:2526)
        at net.sf.json.JSONArray._fromCollection(JSONArray.java:1057)
        at net.sf.json.JSONArray.fromObject(JSONArray.java:123)
        at net.sf.json.AbstractJSON._processValue(AbstractJSON.java:237)
        at net.sf.json.JSONObject._processValue(JSONObject.java:2808)

这是此线程持有的唯一锁定。我试过简单地用谷歌搜索监视器条目值所指的内容,但没有任何运气。对于此线程,值[0x000000004dec8000]似乎不引用对象ID,并且它不会出现在堆栈跟踪中的任何其他位置。

我发现exact same issue here没有回答,而older SO question表示这是因未正确地将监视器分配给其中一个等待线程而导致的JVM错误。我不完全确定我理解如何将一个线程标记为锁定监视器但实际上没有给监视器,但是这些操作可能是分开的,并且JVM中的错误在分配锁之后会导致问题但是在分配显示器之前(虽然我一直认为它们是同一个东西)。

我正在使用的java版本是:

java版“1.6.0_18” Java(TM)SE运行时环境(版本1.6.0_18-b07) Java HotSpot(TM)64位服务器VM(内置16.0-b13,混合模式)

在:

CentOS 5.2版(最终版) 内核版本:2.6.18-194.17.4.el5xen

这真的只是一个JVM错误还是还有其他我应该研究的内容?

编辑:

我们使用的commons-beanutils版本是1.7。我们已经升级到1.8,看它是否解决了这个问题。

1 个答案:

答案 0 :(得分:0)

这似乎与此错误相关

https://issues.apache.org/jira/browse/BEANUTILS-49

第一次加载类时,加载和静态块是线程安全的。如果加载课程时出现问题,这并不总是很明显。