并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue,我该用哪一个啊

昵称是可以中文吗 2017-01-21 09:00:24
现在要实现一个功能,
1.不断的从数据库读取数据,存到队列
2.取出队列的内容,进行处理

其实类似于一个生产者消费者的问题,请问该用哪个去实现?这两个有啥区别
...全文
531 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
colie_li 2017-02-14
  • 打赏
  • 举报
回复
你是不是想做缓存啊,如果只做服务器启动缓存这两个都不太合适,如果非要用这个的话ConcurrentLinkedQueue要好一点。 因为LinkedBlockingQueue如果为空的话会阻塞,如果有请求过来的话会被阻塞在这,无法响应。如果是任务task之类的应用LinkedBlockingQueue比较合适。如果用ConcurrentLinkedQueue的话不会被阻塞但是需要判断下为空的时候是不是需要重新load下什么的。 如果是做本地catch的话guava不错。可以加群交流222379715
star19860411 2017-01-23
  • 打赏
  • 举报
回复
由于LinkedBlockingQueue实现是线程安全的,实现了先进先出等特性,是作为生产者消费者的首选
Defonds 2017-01-23
  • 打赏
  • 举报
回复
楼主,如果你的服务器大多数线程都处于这种阻塞等待状态,会发生什么事情? 如果你能明白了这些,你就知道为何大多数场景不合适了。
oO临时工Oo 2017-01-22
  • 打赏
  • 举报
回复
LinkedBlockingQueue
  • 打赏
  • 举报
回复
引用 2 楼 defonds 的回复:
没有标准答案,看你的场景,以及你对他俩之间的差异的理解程度。 如果队列为空 LinkedBlockingQueue 会发生阻塞,而 ConcurrentLinkedQueue 不会。让线程进入阻塞等待,对于大多数场景都是一个很糟糕的事情。但是生产者消费者环境下,推荐 LinkedBlockingQueue。
队列为空 LinkedBlockingQueue 会发生阻塞,而 ConcurrentLinkedQueue 不会。让线程进入阻塞等待,对于大多数场景都是一个很糟糕的事情;如果满了肯定要等待啊,不让还能做什么
Defonds 2017-01-22
  • 打赏
  • 举报
回复
没有标准答案,看你的场景,以及你对他俩之间的差异的理解程度。 如果队列为空 LinkedBlockingQueue 会发生阻塞,而 ConcurrentLinkedQueue 不会。让线程进入阻塞等待,对于大多数场景都是一个很糟糕的事情。但是生产者消费者环境下,推荐 LinkedBlockingQueue。
姜小白- 2017-01-21
  • 打赏
  • 举报
回复
container Collection 标记: 顶级接口 List 标记: interface ArrayList 标记: class CRUD : boolean add​(E e) boolean remove​(Object o) E set​(int index, E element) E get​(int index) 底层数组实现,查询快,增删慢 LinkedList 标记: class CRUD : boolean add​(E e) E get​(int index) 底层为链表,增删快,查询快 Vector 标记: class 底层数组实现,线程安全,速度太慢,没用 CopyOnWriteArrayList 标记: class Set 标记: interface HashSet 标记: class CRUD : boolean add​(E e) boolean remove​(Object o) 底层哈希表,基于hashCode的equals的比较方式,线程不安全,存取速度快。 SortedSet 标记: interface TreeSet 标记: class 实现comparable接口,元素是以二叉树的形式存放的。线程不安全 CopyOnWriteArraySet 标记: class Queue 标记: interface BlockingQueue 标记: interface ArrayBlockingQueue LinkedBlockingQueue ConcurrentLinkedQueue 标记: class Map 标记: 顶级接口 HashMap 标记: class V get​(Object key) V put​(K key, V value) Set keySet​() Set> entrySet​() 线程不安全,速度快,允许存放null键,null值。 SortedMap 标记: class TreeMap 对键进行排序 HashTable 标记: class Properties 标记: class 线程安全,速度慢,不允许存放null键,null值,已被HashMap替代。 Collections 标记: 均以synchronized实现, 性能没用提高 synchronizedCollection synchronizedList synchronizedSet synchronizedMap synchronizedSortedSet synchronizedSortedSet JUC CopyOnWriteArrayList 写有锁,读无锁,读写之间不阻塞,优于读写锁 写入时先copy一个容器副本,再添加新元素,最后替换引用 copy的容器副本过大时,速度慢,不易使用 CopyOnWriteArraySet 底层使用CopyOnWriteArrayList实现 使用addIfAbsent()添加元素时,会遍历数组,如果存在元素,则抛弃副本 ConcurrentHashMap 初始容量默认为16段(segment),使用分段锁设计 ConcurrentLinkedQueue并发下性能最好的队列 无锁,采用CAS比较算法,核心参数(V,E,N) V:要更新的变量 E:预期值 N:新值 只有当V==E时,V=N;否则表示已被更新过,则取消当前操作 阻塞队列 BlockingQueue接口 void put(E e) 将指定元素插入此队列,如果没有可用空间,则等待 E take()获取并移除此队列头部元素,如果没有可用元素,则等待 ArrayBlockingQueue 数组结构实现,有界队列,手工固定上限 LinkedBlockingQueue 链表结构实现,无界队列(默认上限Integer.MAX_VALUE)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧