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

Print this page




  41     public ReferenceQueue() { }
  42 
  43     private static class Null extends ReferenceQueue {
  44         boolean enqueue(Reference r) {
  45             return false;
  46         }
  47     }
  48 
  49     static ReferenceQueue NULL = new Null();
  50     static ReferenceQueue ENQUEUED = new Null();
  51 
  52     static private class Lock { };
  53     private Lock lock = new Lock();
  54     private volatile Reference<? extends T> head = null;
  55     private long queueLength = 0;
  56 
  57     boolean enqueue(Reference<? extends T> r) { /* Called only by Reference class */
  58         synchronized (r) {
  59             if (r.queue == ENQUEUED) return false;
  60             synchronized (lock) {





  61                 r.queue = ENQUEUED;
  62                 r.next = (head == null) ? r : head;
  63                 head = r;
  64                 queueLength++;
  65                 if (r instanceof FinalReference) {
  66                     sun.misc.VM.addFinalRefCount(1);
  67                 }
  68                 lock.notifyAll();
  69                 return true;
  70             }
  71         }
  72     }
  73 
  74     private Reference<? extends T> reallyPoll() {       /* Must hold lock */
  75         if (head != null) {
  76             Reference<? extends T> r = head;
  77             head = (r.next == r) ? null : r.next;
  78             r.queue = NULL;
  79             r.next = r;
  80             queueLength--;




  41     public ReferenceQueue() { }
  42 
  43     private static class Null extends ReferenceQueue {
  44         boolean enqueue(Reference r) {
  45             return false;
  46         }
  47     }
  48 
  49     static ReferenceQueue NULL = new Null();
  50     static ReferenceQueue ENQUEUED = new Null();
  51 
  52     static private class Lock { };
  53     private Lock lock = new Lock();
  54     private volatile Reference<? extends T> head = null;
  55     private long queueLength = 0;
  56 
  57     boolean enqueue(Reference<? extends T> r) { /* Called only by Reference class */
  58         synchronized (r) {
  59             if (r.queue == ENQUEUED) return false;
  60             synchronized (lock) {
  61                 // Check that since getting the lock this reference hasn't already been
  62                 // enqueued (and even then removed)
  63                 if (r.queue != this) {
  64                     return false;
  65                 }
  66                 r.queue = ENQUEUED;
  67                 r.next = (head == null) ? r : head;
  68                 head = r;
  69                 queueLength++;
  70                 if (r instanceof FinalReference) {
  71                     sun.misc.VM.addFinalRefCount(1);
  72                 }
  73                 lock.notifyAll();
  74                 return true;
  75             }
  76         }
  77     }
  78 
  79     private Reference<? extends T> reallyPoll() {       /* Must hold lock */
  80         if (head != null) {
  81             Reference<? extends T> r = head;
  82             head = (r.next == r) ? null : r.next;
  83             r.queue = NULL;
  84             r.next = r;
  85             queueLength--;