码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2017-08-01 15:44:29      阅读:502      评论:0      收藏:0      [点我收藏+]

标签:pre   java多线程   otf   lock   log   syn   应用   取出   条件   

在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用法

标签:pre   java多线程   otf   lock   log   syn   应用   取出   条件   

原文地址:http://www.cnblogs.com/javabg/p/7268581.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!