fullyLock()
包含两个锁:putLock和takeLock,它们都是ReentrantLock
和NonfairSync
void fullyLock() {
putLock.lock();
takeLock.lock();
}
会有这样的情况吗?
在remove()
方法中,putLock.lock()
成功,takeLock.lock()
抛出异常,那么当前线程将始终持有putLock
,其他线程将永远无法操作此LinkedBlockingQueue。
- 有可能发生这样的问题吗?
- 如果不可能,为什么? 如果可能的话,jdk或我们可以做些什么来补救它?
remove()
code:
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();
}
}
锁方法不会抛出任何异常。因此,你的问题就不会发生了。
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html