src/share/classes/java/lang/ref/ReferenceQueue.java

Print this page

        

*** 56,65 **** --- 56,72 ---- boolean enqueue(Reference<? extends T> r) { /* Called only by Reference class */ synchronized (r) { if (r.queue == ENQUEUED) return false; synchronized (lock) { + // There is a race between this method and the polling: it may occur + // that one thread just successfully removed a Reference from the queue, + // making it inactive, and another thread calling this method on this + // queue with the same Reference instance. Filter out those attempts. + if (r.queue != this) { + return false; + } r.queue = ENQUEUED; r.next = (head == null) ? r : head; head = r; queueLength++; if (r instanceof FinalReference) {