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

Gary D. Gregory commented on LANG-792:
--------------------------------------

Howdy,

A thread local is used so that calling reflectionToString on the same object 
(and any of its referred objects) from multiple threads works (returns the same 
String).

If the registry was _not_ a thread local, then all threads would share the 
registry and that would lead to some threads not getting a proper toString of 
an object because another thread already registered it, erroneously thinking it 
was already visited.

For example for an object o that has one ivar x which itself has a y ivar 
pointing to "y":

Thread 1: registers x and does a deep toStrings on x
Thread 2: checks that x is registered, it is, so it uses the default toString 
for x (not the deep toString)
Thread 1: ungisters x
...

Thread 1 gets x[y["y"]] OK
Thread 2 gets x[y@123] BAD

Also, with a thread local, the registry does not need to be a thread-safe data 
structure.
                
> ToStringStyle registry may retain entries between invocations - is this a 
> problem?
> ----------------------------------------------------------------------------------
>
>                 Key: LANG-792
>                 URL: https://issues.apache.org/jira/browse/LANG-792
>             Project: Commons Lang
>          Issue Type: Bug
>            Reporter: Sebb
>
> The class ToStringStyle maintains a registry in order to try to detect object 
> cycles (introduced by LANG-69).
> Multiple instances in the same thread share the same registry (it's a 
> ThreadLocal - not clear why).
> Entries can be left in the registry on return from calling various methods on 
> the instance.
> Is this a bug? Can object cycles cause problems across method calls?
> If it is intended for the registered objects to remain across method calls, 
> can objects from different instances interfere with each other?
> The registry uses a WeakHashMap, so the entries should not cause problems for 
> garbage collection.
> One solution would be to use an instance field to hold the map instead of 
> sharing them.
> Would that use more memory, or be otherwise less efficient?

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to