Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Won't Fix
-
None
-
None
-
Apache Maven 3.0.3 (r1075438; 2011-02-28 12:31:09-0500)
Maven home: C:\Java\apache-maven-3.0.3\bin\..
Java version: 1.6.0_24, vendor: Sun Microsystems Inc.
Java home: C:\Program Files\Java\jdk1.6.0_24\jre
Default locale: en_US, platform encoding: Cp1252
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"Apache Maven 3.0.3 (r1075438; 2011-02-28 12:31:09-0500) Maven home: C:\Java\apache-maven-3.0.3\bin\.. Java version: 1.6.0_24, vendor: Sun Microsystems Inc. Java home: C:\Program Files\Java\jdk1.6.0_24\jre Default locale: en_US, platform encoding: Cp1252 OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"
Description
Moving discussion here from https://issues.apache.org/jira/browse/POOL-191 ConcurrentModificationException in GenericObjectPool LinkedList.
It is possible to get a ConcurrentModificationException in a LinkedList from a Commons Pool GenericObjectPool.
This happens when I call ReflectionToStringBuilder.toString(this) from a subclass of GenericObjectPool. My guess is that it would happen with just ReflectionToStringBuilder.toString(gop). IOW, subclassing does not have anything to do with it I would venture.
For example, in this stack trace JmsSessionPool is a subclass of GenericObjectPool.
java.util.ConcurrentModificationException at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:761) at java.util.LinkedList$ListItr.next(LinkedList.java:696) at java.util.AbstractCollection.toString(AbstractCollection.java:421) at java.lang.String.valueOf(String.java:2826) at java.lang.StringBuffer.append(StringBuffer.java:219) at org.apache.commons.lang3.builder.ToStringStyle.appendDetail(ToStringStyle.java:598) at org.apache.commons.lang3.builder.ToStringStyle.appendInternal(ToStringStyle.java:473) at org.apache.commons.lang3.builder.ToStringStyle.append(ToStringStyle.java:436) at org.apache.commons.lang3.builder.ToStringBuilder.append(ToStringBuilder.java:848) at org.apache.commons.lang3.builder.ReflectionToStringBuilder.appendFieldsIn(ReflectionToStringBuilder.java:528) at org.apache.commons.lang3.builder.ReflectionToStringBuilder.toString(ReflectionToStringBuilder.java:692) at org.apache.commons.lang3.builder.ReflectionToStringBuilder.toString(ReflectionToStringBuilder.java:288) at org.apache.commons.lang3.builder.ReflectionToStringBuilder.toString(ReflectionToStringBuilder.java:119) at com.seagullsw.appinterface.comm.jms.JmsSessionPool.toString(JmsSessionPool.java:120) at java.lang.String.valueOf(String.java:2826) at java.lang.StringBuffer.append(StringBuffer.java:219) at org.apache.commons.lang3.builder.ToStringStyle.appendDetail(ToStringStyle.java:586) at org.apache.commons.lang3.builder.ToStringStyle.appendInternal(ToStringStyle.java:550) at org.apache.commons.lang3.builder.ToStringStyle.append(ToStringStyle.java:436) at org.apache.commons.lang3.builder.ToStringBuilder.append(ToStringBuilder.java:848) at org.apache.commons.lang3.builder.ReflectionToStringBuilder.appendFieldsIn(ReflectionToStringBuilder.java:528) at org.apache.commons.lang3.builder.ReflectionToStringBuilder.toString(ReflectionToStringBuilder.java:689) at org.apache.commons.lang3.builder.ReflectionToStringBuilder.toString(ReflectionToStringBuilder.java:288) at org.apache.commons.lang3.builder.ReflectionToStringBuilder.toString(ReflectionToStringBuilder.java:119) at com.seagullsw.appinterface.server.comm.BasicCommunicationManager.toString(BasicCommunicationManager.java:828) at com.seagullsw.appinterface.server.comm.BasicCommunicationManager.toString(BasicCommunicationManager.java:817) at java.lang.String.valueOf(String.java:2826) at java.lang.StringBuilder.append(StringBuilder.java:115) at com.seagullsw.appinterface.server.AisHelper.waitForCommuncationManagers(AisHelper.java:217) at com.seagullsw.appinterface.server.AisHelper.start(AisHelper.java:136) at com.seagullsw.appinterface.server.AisHelper.startFromResource(AisHelper.java:161) at com.seagullsw.appinterface.server.AbstractServerJunit4.startServer(AbstractServerJunit4.java:179) at com.seagullsw.appinterface.server.comm.jms.AbstractJmsRoundtripMaxConcurrencyTestCase.setUpOnce(AbstractJmsRoundtripMaxConcurrencyTestCase.java:141) at com.seagullsw.appinterface.server.comm.jms.ibmmq.JmsRoundtripMaxConcurrency032TestCase.setUpOnce(JmsRoundtripMaxConcurrency032TestCase.java:40)
We should either:
- Document ReflectionToStringBuilder and ToStringBuilder such that call sites use synchronized if the object passed in contains collections that are not thread-safe. F
or example:
@Override public synchronized String toString() { return ReflectionToStringBuilder.toString(this); }
- Or have our code in ReflectionToStringBuilder and ToStringBuilder lock collections while they are being toString'd.