LinkedBlockingQueue fullLock() 抛出异常,fullUnlock() 不会执行



fullyLock()包含两个锁:putLock和takeLock,它们都是ReentrantLockNonfairSync

void fullyLock() {
putLock.lock();
takeLock.lock();
}

会有这样的情况吗?

remove()方法中,putLock.lock()成功,takeLock.lock()抛出异常,那么当前线程将始终持有putLock,其他线程将永远无法操作此LinkedBlockingQueue。

  1. 有可能发生这样的问题吗?
  2. 如果不可能,为什么?
  3. 如果可能的话,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

最新更新