src/share/classes/java/lang/ref/ReferenceQueue.java
Print this page
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
@@ -38,29 +38,29 @@
/**
* Constructs a new reference-object queue.
*/
public ReferenceQueue() { }
- private static class Null extends ReferenceQueue {
- boolean enqueue(Reference r) {
+ private static class Null<S> extends ReferenceQueue<S> {
+ boolean enqueue(Reference<? extends S> r) {
return false;
}
}
- static ReferenceQueue NULL = new Null();
- static ReferenceQueue ENQUEUED = new Null();
+ static ReferenceQueue<Object> NULL = new Null<>();
+ static ReferenceQueue<Object> ENQUEUED = new Null<>();
static private class Lock { };
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;
+ ReferenceQueue<?> queue = r.queue;
if ((queue == NULL) || (queue == ENQUEUED)) {
return false;
}
assert queue == this;
r.queue = ENQUEUED;
@@ -73,14 +73,17 @@
lock.notifyAll();
return true;
}
}
+ @SuppressWarnings("unchecked")
private Reference<? extends T> reallyPoll() { /* Must hold lock */
Reference<? extends T> r = head;
if (r != null) {
- head = (r.next == r) ? null : r.next;
+ head = (r.next == r) ?
+ null :
+ r.next; // Unchecked due to the next field having a raw type in Reference
r.queue = NULL;
r.next = r;
queueLength--;
if (r instanceof FinalReference) {
sun.misc.VM.addFinalRefCount(-1);