fullyLock() 会操作两把锁:putLock 和 takeLock, 它们都是 ReentrantLock
,并且也是 NonfairSync
void fullyLock() {
putLock.lock();
takeLock.lock();
}
有没有可能发生这样一种情况 :putLock.lock()
执行成功,但是takeLock.lock()
抛出异常?
因为这样的话,就会导致当前线程永远持有putLock
,其他线程将永远无法操作当前的LinkedBlockingQueue
。
- 这种情况是否会发生?
- 如果不会的话,为什么呢?
- 如果会的话,可以做什么措施进行优化?
LinkedBlockingQueue
的 remove()
源码:
public void remove() {
if (lastRet == null)
throw new IllegalStateException();
fullyLock();
try {
Node<E> node = lastRet;
lastRet = null;
for (Node<E> trail = head, p = trail.next;
p != null;
trail = p, p = p.next) {
if (p == node) {
unlink(p, trail);
break;
}
}
} finally {
fullyUnlock();
}
}