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--; |