DelayQueue获取元素的方法
public E take() throws InterruptedException {
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();
try {
for (;;) {
E first = q.peek();
if (first == null)
available.await();
else {
long delay = first.getDelay(NANOSECONDS);
if (delay <= 0)
return q.poll();
//就是这个地方,为啥置位为null可以防止内存泄漏?
first = null; // don't retain ref while waiting
if (leader != null)
available.await();
else {
Thread thisThread = Thread.currentThread();
leader = thisThread;
try {
available.awaitNanos(delay);
} finally {
if (leader == thisThread)
leader = null;
}
}
}
}
} finally {
if (leader == null && q.peek() != null)
available.signal();
lock.unlock();
}
}
因为超时醒来后,又会从循环开头开始,给first赋值,但最后退出前,当前线程并未执行first=null,所以如何理解呢???
https://blog.csdn.net/Donald_Draper/article/details/88307255