栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

多线程(五) -- 并发工具(二) -- J.U.C并发包(六) -- LinkedQueue详解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

多线程(五) -- 并发工具(二) -- J.U.C并发包(六) -- LinkedQueue详解

linkedBlockingDeque: 内部维护的节点对象:
public class linkedBlockingDeque
    extends AbstractQueue
    implements BlockingDeque, java.io.Serializable {
	 
    static final class Node {
        
        E item;

		// JDK13中的,jdk8没有
        
        // Node prev;

        
        
        // 队列容量满了,就等待
        while (count.get() == capacity) {
            // 倒过来读:等待不满
            notFull.await();
        }
        // 有空位,入队且计数加一
        enqueue(node);
        // 返回的是+1前的值
        c = count.getAndIncrement();
        if (c + 1 < capacity)
            // 除了自己put以外,队列还有空位,由自己唤醒之前等待的put线程
            // 一次只唤醒一个,避免不必要的竞争
            notFull.signal();
    } finally {
        putLock.unlock();
    }
    // 如果队列中中一个元素,叫醒take线程
    if (c == 0)
        // 一次只唤醒一个,避免不必要的竞争
        signalNotEmpty();
}
take操作

和put类型,不做分析

和Array性能比较:

主要列举linkedBlockingQueue(推荐)和ArrayBlockingQueue的性能比较

linked支持有界,Array强制有界linked实现是链表,Array是数组linked是懒惰的,而Array需要提前初始化Node数组linked每次入队会生成新Node,而Array的Node是提前创建好的linked两把锁,Array一把锁 ConcurrentlinkedQueue:

ConcurrentlinkedQueue的设计和linkedBlockingQueue非常像,也是:

两把锁,同一时刻,可以允许两个线程(一个生产者一个消费者)执行dummy节点的引入让两把锁将来锁住的是不同对象,避免竞争只是这锁使用了cas来实现

事实上,ConcurrentlinkedQueue应用还是非常广泛的:
例如之前讲的Tomcat的Connector结构时,Acceptor作为生产者向Poller消费者传递事件信息时,正是采用了ConcurrentlinkedQueue将ScoketChannel给Poller使用:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/749462.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号