Details
-
Bug
-
Status: Open
-
Resolution: Unresolved
-
1.8
-
None
-
None
-
Operating System: All
Platform: All
Description
In org.apache.batik.util.CleanerThread we see:
public static ReferenceQueue getReferenceQueue() {
if ( queue == null ) {
synchronized (CleanerThread.class)
}
return queue;
}
This method is not thread safe due to a race condition. The test for "if (queue
== null)" needs to be inside the synchronized block, not outside of it. As
written, it's possible for the initialization code to be executed more than once.
Fix: make the entire method synchronized, or add an additional test for "if
(queue == null)" within the synchronized block (but see
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html for why
the variable needs to remain volatile).