commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "David I. (JIRA)" <j...@apache.org>
Subject [jira] Commented: (LANG-349) Deadlock using ReflectionToStringBuilder
Date Tue, 21 Aug 2007 17:59:31 GMT

    [ https://issues.apache.org/jira/browse/LANG-349?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12521542
] 

David I. commented on LANG-349:
-------------------------------

It does make sense that the reflection code isn't synchronized (since toString() isn't?).
That might be the core issue. 

It helps to know that you aren't using a HashMap internally. 

I could wrap the builder code in a synchronized block to prevent this. Does that sound like
a good solution? If so, it would be nice to update the documentation to point out how toString
and the reflection code isn't thread safe. 

Would it be possible to have add a "thread-safe" version that synchronizes on each variable
(or the whole class) before reading it during the reflection process? 

> Deadlock using ReflectionToStringBuilder
> ----------------------------------------
>
>                 Key: LANG-349
>                 URL: https://issues.apache.org/jira/browse/LANG-349
>             Project: Commons Lang
>          Issue Type: Bug
>    Affects Versions: 2.0
>         Environment: java version "1.5.0_10"
> Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_10-b03)
> Java HotSpot(TM) Server VM (build 1.5.0_10-b03, mixed mode)
> >uname -a
> Linux fwjsfimat04 2.4.21-32.EL #1 SMP Fri Apr 15 21:02:58 EDT 2005 x86_64 x86_64 x86_64
GNU/Linux
>            Reporter: David I.
>            Priority: Critical
>             Fix For: 2.4
>
>
> I used the ReflectionToStringBuilder on an object to output debugging messages to Log4j.
If this object was picked up by two different threads and the toString() method was called
at the same time in two different threads, a deadlock occurrs.
> Here is a stack trace from using jstack:
> Thread 1172: (state = BLOCKED)
>  - java.util.Vector.hashCode() @bci=0, line=938 (Interpreted frame)
>  - java.util.HashMap.containsKey(java.lang.Object) @bci=6, line=377 (Compiled frame)
>  - org.apache.commons.lang.builder.ReflectionToStringBuilder.toString() @bci=50, line=522
(Compiled frame)
>  - org.apache.commons.lang.builder.ReflectionToStringBuilder.toString(java.lang.Object,
org.apache.commons.lang.builder.ToStringStyle, boolean, java.lang.Class) @bci=12, line=265
(Interpreted frame)
>  - org.apache.commons.lang.builder.ReflectionToStringBuilder.toString(java.lang.Object,
org.apache.commons.lang.builder.ToStringStyle) @bci=4, line=197 (Interpreted frame)
>  - org.apache.commons.lang.builder.ToStringBuilder.reflectionToString(java.lang.Object,
org.apache.commons.lang.builder.ToStringStyle) @bci=2, line=170 (Interpreted frame)
> [...]
> Thread 1191: (state = BLOCKED)
>  - java.util.Vector.hashCode() @bci=0, line=938 (Interpreted frame)
>  - java.util.HashMap.containsKey(java.lang.Object) @bci=6, line=377 (Compiled frame)
>  - org.apache.commons.lang.builder.ReflectionToStringBuilder.toString() @bci=50, line=522
(Compiled frame)
>  [...]

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message