繁体   English   中英

Java阻塞队列实现问题

[英]Java Blocking Queue Implementation Questions

常见的实现在这里 ,Java的内置实现在这里 关于这两个实现,我有两个问题:

1)第一个实现在put()和take()方法上使用了synchronized关键字,这意味着只有一个线程可以访问一个方法。 假设如果线程A调用put()并发现队列已满,因此正在等待,则由于锁尚未释放,因此没有人可以调用take()方法,该实现如何使用?

2)Java的内置函数使用两个锁:takeLock和putLock,分别用于put()和take()。 我看到间隔队列是一个链表,它不是线程安全的,怎么办?

正如一些评论中已经提到的那样,第一个实现仅使用传统的wait()/ notify()机制,其中一个线程等待(当然释放锁)供其他线程通知。

第二个使用不同的锁进行放置和取出操作。 因此,各个操作(同时put()或take())是同步的。 但是当队列已满或为空时,它们需要彼此通信。 因此,它们通过condition彼此交互。 签出两种私人方法-

    /**
     * Signals a waiting take. Called only from put/offer (which do not
     * otherwise ordinarily lock takeLock.)
     */
    private void signalNotEmpty() {
        final ReentrantLock takeLock = this.takeLock;
        takeLock.lock();
        try {
            notEmpty.signal();
        } finally {
            takeLock.unlock();
        }
    }

    /**
     * Signals a waiting put. Called only from take/poll.
     */
    private void signalNotFull() {
        final ReentrantLock putLock = this.putLock;
        putLock.lock();
        try {
            notFull.signal();
        } finally {
            putLock.unlock();
        }
    }

put方法向尝试从空队列中进行/轮询的其他线程发出信号,而take方法向试图将元素放入完整队列的其他线程发出信号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM