在使用队列在生产者html" target="_blank">线程和使用者线程之间进行通信的情况下,人们通常会建议使用LinkedBlockingQueue
或ConcurrentLinkedQueue
吗?
与另一种相比,使用一种有什么优点/缺点?
从API角度看,我的主要区别是a LinkedBlockingQueue
可以有选择地限制。
对于生产者/消费者线程,我不确定这ConcurrentLinkedQueue
是否是一个合理的选择-
它没有实现BlockingQueue
,这是生产者/消费者队列IMO的基本接口。您必须打电话poll()
,如果您什么都没找到,请稍等,然后再次轮询等…导致新项目进入时出现延迟,而新项目空着时效率低下(由于从睡眠中不必要地唤醒)
。
从BlockingQueue的文档中:
BlockingQueue
实现被设计为主要用于生产者-消费者队列
我知道这并不是 严格 说生产者-消费者队列只应使用阻塞队列,但即使如此……
主要内容:1 LinkedBlockingQueue的概述,2 LinkedBlockingQueue的原理,2.1 主要属性,2.2 构造器,2.3 入队操作,2.4 出队操作,2.5 检查操作,2.6 size操作,2.7 迭代操作,3 LinkedBlockingQueue的总结基于JDK1.8详细介绍了LinkedBlockingQueue的底层源码实现,包括锁分离的原理,以及入队列、出队列等操作源码。实际上LinkedBlockingQueue的源码还是非常简单的! 1 LinkedB
当我们讨论使用Executors服务处理异步事件时,为什么创建一个新的固定线程池涉及到使用LinkedBlockingQueue?到达的事件完全不依赖,所以为什么要使用队列,因为使用者线程仍然会涉及take Lock的争用?为什么Executors类没有一些混合数据结构(例如并发映射实现),在大多数情况下不需要带锁?
前言 在前面的文章ArrayBlockingQueue中,已经对JDK中的BlockingQueue中的做了一个回顾,同时对ArrayBlockingQueue中的核心方法作了说明,而LinkedBlockingQueue作为JDK中BlockingQueue家族系列中一员,由于其作为固定大小线程池(Executors.newFixedThreadPool())底层所使用的阻塞队列,分析它的目的主
问题内容: 我在两个不同的线程之间使用。一个线程通过添加数据,而另一个线程通过添加数据。 我的问题是,我是否需要同步对和的访问。是的插入和删除方法是线程安全的? 问题答案: 是。从文档: “ BlockingQueue实现是线程安全的。所有排队方法都使用内部锁或其他形式的并发控制以原子方式实现其效果。但是,除非在实现中另行指定,否则批量Collection操作addAll,containsAll,
问题内容: 当喜欢过? 何时以及何时使用哪种数据结构: 您想要高效的读写 应该具有更少的内存占用 尽管存在类似的问题,但它并没有突出表明应该优先选择哪个事实? 问题答案: 蜘蛛侠鲍里斯(Boris the Spider)已经概述了和之间最明显的区别-前者始终是有界的,而后者可以是无界的。 因此,如果您需要无限制的阻塞队列,或者将其用作工具箱中的最佳选择。 但是,假设您需要一个有限的阻塞队列。最后,
问题内容: 我最近正在学习Java并发编程。我知道关键字可以保证安全的发布。但是,当我阅读源代码时,发现and 字段未使用关键字。我发现该方法在方法中被调用,并且该方法直接将值分配给。此时,可能是因为未使用声明。我的理解正确吗?虽然可以保证读写线程的安全性,但是可以 保证不是一个正确的初始值 问题答案: 根据此博客文章https://shipilev.net/blog/2014/safe-publ