首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java阻塞队列实现问题

问Java阻塞队列实现问题
EN

Stack Overflow用户
提问于 2015-04-09 15:12:05
回答 1查看 478关注 0票数 0

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-09 16:34:09

正如在一些注释中已经提到的,第一个实现只是使用传统的wait()/notify()机制,其中一个线程等待(当然也是释放锁)以得到其他线程的通知。

第二个锁使用不同的锁,每个锁用于put和operations操作。因此,单个操作(同时进行put()或put())是同步的。但是,当队列已满或空时,它们需要相互通信。所以他们通过condition互相交流。检查一下这两种私人方法-

代码语言:javascript
复制
    /**
     * 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方法向其他试图将元素放入完整队列的线程发出信号。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29542368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档