[
https://issues.apache.org/jira/browse/ABDERA-155?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
James M Snell resolved ABDERA-155.
----------------------------------
Resolution: Fixed
Fix checked in. Please test
> 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.