public boolean offer(E e) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
q.offer(e);
if (q.peek() == e) {
leader = null;
available.signal();
}
return true;
} finally {
lock.unlock();
}
}
if (q.peek() == e) 是指当新增入队的元素是最快出队的的元素,说明队头已经改了,就说明awaitNanos的线程需要重新调整等待时间(因为他之前awaitNanos的是旧的队头),然后leader设为空,唤醒其中一个等待的线程
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();
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();
}
}
个人理解,leader的作用就是只让一个线程执行available.awaitNanos(delay),其他的线程都是available.await();(太多线程awaitNanos,造成很多线程自动唤醒,性能不好)