java高并发(十七)J.U.C之BlockingQueue

释放双眼,带上耳机,听听看~!

BlockingQueue就是阻塞队列。在某些情况下对阻塞队列的访问可能会造成阻塞。

java高并发(十七)J.U.C之BlockingQueue

会产生阻塞的情况有以下两种:

  1. 当队列满之后,进行入队操作;
  2. 当队列空之后,进行出队操作;

 因此,当一个线程对一个队列已满的情况下进行入队操作就会产生阻塞,除非有另一个线程进行出队列操作。同样当一个线程对一个空队列进行出队操作时也会被阻塞,除非有另一个线程进行入队操作。

    根据上面的特性可以知道,阻塞队列是线程安全的。通常用在生产者消费者场景。

实现类 ArrayBlockingQueue

    ArrayBlockingQueue是一个有界的阻塞队列(容量有限),内部使用数组实现,以先进先出的方式存储数据

实现类DelayQueue

    DelayQueue阻塞的是内部元素,DelayQueue中的元素必须实现一个接口,是J.U.C中的Delay接口(继承了Comparable接口)。DelayQueue中的元素需要进行排序。一般情况下按照元素过期时间的优先级进行排序。

    DelayQueue的使用场景:定时关闭连接、缓存对象、超时处理等。

实现类LinkedBlockingQueue

LinkedBlockingQueue的大小和配置是可选的,如果初始化时指定了一个大小,那么就是有边界的;如果不指定大小,那么就是无边界的(默认最大整型值,内部实现是一个链表)。也是以先进先出的方式存储数据。

实现类PriorityBlockingQueue

这是一个带优先级的阻塞队列,同时也是一个无边界的队列,但是有排序规则的。需要注意的是PriorityBlockingQueue是允许插入null(空对象)的。插入PriorityBlockingQueue的对象必须实现comparable接口,队列优先级的排序规则就是按照对接口实现来定义的。

实现类SynchronousQueue

内部仅允许容纳一个元素,当一个线程插入一个元素后就会被阻塞,除非元素被另一个线程消费。因此又称之为同步队列。是一个无界非缓存的队列,准确的说他不存储元素,只有等待元素取走之后才能放入。

转载于:https://my.oschina.net/duanvincent/blog/3082105

给TA打赏
共{{data.count}}人
人已打赏
安全经验

海外中文博客与Adsense

2021-10-11 16:36:11

安全经验

安全咨询服务

2022-1-12 14:11:49

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索