LinkedBlockingQueue 如果 fullyLock() 抛出异常, fullyUnlock() 是否永远不会执行

death00
  • 33

fullyLock() 会操作两把锁:putLock 和 takeLock, 它们都是 ReentrantLock,并且也是 NonfairSync

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

有没有可能发生这样一种情况 :putLock.lock()执行成功,但是takeLock.lock()抛出异常?

因为这样的话,就会导致当前线程永远持有putLock,其他线程将永远无法操作当前的LinkedBlockingQueue

  1. 这种情况是否会发生?
  2. 如果不会的话,为什么呢?
  3. 如果会的话,可以做什么措施进行优化?

LinkedBlockingQueueremove() 源码:

    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();
        }
    }
回复
阅读 225
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏