[ 
https://issues.apache.org/jira/browse/ABDERA-155?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12593900#action_12593900
 ] 

David Calavera commented on ABDERA-155:
---------------------------------------

a possible solution might be to transform Abdera class into a singleton and 
call these methods from an init method but we'd change every call to the 
constructor by a call to the getInstance method.

I endose a patch with that solution.

> Abdera class "this" reference escapes during construction, leading to race 
> conditions and NPEs
> ----------------------------------------------------------------------------------------------
>
>                 Key: ABDERA-155
>                 URL: https://issues.apache.org/jira/browse/ABDERA-155
>             Project: Abdera
>          Issue Type: Bug
>    Affects Versions: 0.4.0
>         Environment: OS X, JVM 1.5, 2 x 2.8 GHz quad-core Xeon
>            Reporter: Todd Wells
>            Priority: Critical
>         Attachments: abdera_singleton.diff
>
>
> I have hit a number of NullPointerExceptions when using Abdera in a very 
> generic and straightforward fashion.  The same code doesn't cause the NPEs in 
> all cases, it seems to depend on the environment in which it's executing, 
> which leads to a strong suspicion of a race condition.  I've seen an NPE in 
> code as simple as this groovy code:
> def abdera = new Abdera()
> Entry entry = abdera.newEntry()  /* NPE here, Caused by: 
> java.lang.NullPointerException at 
> org.apache.abdera.Abdera.newEntry(Abdera.java:114)
> Another example was an NPE when calling ClientResponse.getDocument(), Caused 
> by: java.lang.NullPointerException at
> org.apache.abdera.protocol.client.AbstractClientResponse.getDocument(AbstractClientResponse.java:96)
> When I run the code in IDEA (calling from a unit test or executing a custom 
> ant task) it works fine. When I'm calling it from inside of a custom ant task 
> running at the command line, I get the null pointer exceptions that I've 
> described.  This supports the notion of it being a race condition -- the 
> NPE's are highly squirrelly and environment-specific.
> Digging into the Abdera code, I believe I've found the source of the 
> problems.  The constructor of the Abdera class calls newFactory(), 
> newParser(), newXPath(), newParserFactory() and newWriter().  In every one of 
> these methods, a reference to "this" is passed to a different class (or 
> multiple classes, as it would appear).  The fundamental problem here is since 
> this code is being called from the constructor the "this" reference is not 
> yet guaranteed to be a completely constructed object. This can result in 
> unpredictable behavior, such as the NPE mentioned in this bug.  Since the 
> classes (ServiceUtil and AbderaConfiguration) that get references to "this" 
> appear to be using "this" in a multi-threaded fashion, this can result in 
> race conditions.
> For a detailed discussion, I recommend reviewing this article "Safe 
> construction techniques" by Brian Goetz: 
> http://www.ibm.com/developerworks/java/library/j-jtp0618.html, or he has a 
> more detailed discussion of this problem in his book "Java Concurrency in 
> Practice".  I will quote his article here: "One of the mistakes that can 
> introduce a data race into your class is to expose the this reference to 
> another thread before the constructor has completed. Sometimes the reference 
> is explicit, such as directly storing this in a static field or collection, 
> but other times it can be implicit, such as when you publish a reference to 
> an instance of a non-static inner class in a constructor. Constructors are 
> not ordinary methods -- they have special semantics for initialization 
> safety. An object is assumed to be in a predictable, consistent state after 
> the constructor has completed, and publishing a reference to an incompletely 
> constructed object is dangerous."
> This is a serious set of bugs in the Abdera class and the resultant problems 
> will probably become more prevalent as machines become faster.

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

Reply via email to