src/share/classes/java/lang/ref/ReferenceQueue.java
Print this page
*** 53,65 ****
private Lock lock = new Lock();
private volatile Reference<? extends T> head = null;
private long queueLength = 0;
boolean enqueue(Reference<? extends T> r) { /* Called only by Reference class */
- synchronized (r) {
- if (r.queue == ENQUEUED) return false;
synchronized (lock) {
r.queue = ENQUEUED;
r.next = (head == null) ? r : head;
head = r;
queueLength++;
if (r instanceof FinalReference) {
--- 53,70 ----
private Lock lock = new Lock();
private volatile Reference<? extends T> head = null;
private long queueLength = 0;
boolean enqueue(Reference<? extends T> r) { /* Called only by Reference class */
synchronized (lock) {
+ // Check that since getting the lock this reference hasn't already been
+ // enqueued (and even then removed)
+ ReferenceQueue queue = r.queue;
+ if ((queue == NULL) || (queue == ENQUEUED)) {
+ return false;
+ }
+ assert queue == this;
r.queue = ENQUEUED;
r.next = (head == null) ? r : head;
head = r;
queueLength++;
if (r instanceof FinalReference) {
*** 67,81 ****
}
lock.notifyAll();
return true;
}
}
- }
private Reference<? extends T> reallyPoll() { /* Must hold lock */
- if (head != null) {
Reference<? extends T> r = head;
head = (r.next == r) ? null : r.next;
r.queue = NULL;
r.next = r;
queueLength--;
if (r instanceof FinalReference) {
--- 72,85 ----
}
lock.notifyAll();
return true;
}
}
private Reference<? extends T> reallyPoll() { /* Must hold lock */
Reference<? extends T> r = head;
+ if (r != null) {
head = (r.next == r) ? null : r.next;
r.queue = NULL;
r.next = r;
queueLength--;
if (r instanceof FinalReference) {