DelayQueue的take的自旋中first为啥置位为null,网上说防止内存泄漏,但还是不明白

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