并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法

Posted 关键步就几步

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法相关的知识,希望对你有一定的参考价值。

在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出)。Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列,都不能存放null值。

1、BlockingQueue下有两个常用子类LinkedBlockingQueue和ArrayBlockingQueue,内部分链表和数组实现,要想实现获取元素和存放元素的线程安全阻塞,那么只能用里面线程安全的两个方法put()和take()来实现,阻塞的意思就是此条线程会处于等待卡死状态,解锁的条件是队列中有另一条线程存入或取出数据了,就会解锁,说白了就是满了不能再存,空了不能取,都得等着,就相当于队列是仓库,仓库没有货了就生产,仓库有货就能消费,锁条件是notFull和notEmpty,此种队列多用于生产者消费者模式,new之前最好指定容量大小,不然默认是Integer.MAX_VALUE的大小。

2、ConcurrentLinkedQueue是非阻塞队列,其没有put和take方法,可以无限制存,且是线程安全的,N个用户同时存也能保证每次存放在队尾而不乱掉,但是其的size()方法会不定时遍历,所以特耗时,开发时不要用,如果判断是否有元素可以使用isEmpty()方法,千万不要用size()>0来判断是否有元素ConcurrentLinkedQueue的queue.add(obj); 或者 queue.poll(obj);是线程安全的,但是其他方法并没有保证线程安全,如判断isEmpty()所以在多线程时还得自己加锁

synchronized(queue) {    
   if(!queue.isEmpty()) {    
   queue.poll(obj);    
  }    
 }  

  

 

以上是关于并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法的主要内容,如果未能解决你的问题,请参考以下文章

并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法

并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法

Java并发容器--ConcurrentLinkedQueue

并发队列

Java 并发编程 --- ConcurrentLinkedQueue

Java Review - 并发编程_ConcurrentLinkedQueue原理&源码剖析