首页 > 技术文章 > 并发编程:阻塞队列、原子操作

fcb-it 2020-07-14 21:15 原文

阻塞队列

  • 插入元素
    add():添加元素,满了抛异常。
    put():添加元素,满了之后会阻塞。
    offer():添加元素,添加失败后返回false。
    offer(time):添加元素,阻塞一段时间后失败返回false,假如在这期间队列有位置了则添加成功。

  • 删除/获取元素
    remove():从队列中获取数据,没获取到抛异常。
    taker():从队列中取数据,方法会阻塞住操作。
    poll():从队列中获取数据,没获取到返回null。
    poll(time):从队列中获取数据,会阻塞一段时间。

  • offer()方法:通过加锁来添加元素,假如满了返回false

  • 用了Condition实现阻塞,存在Condition-NotEmpty(空的时候阻塞,非空的时候唤醒),Condition-NotFull(满的时候阻塞,非满的时候唤醒)

  • offer(time)方法,用了wait(time)实现定时阻塞

使用阻塞队列实现生产者消费者模型。
生产者消费者模型的优点

  • 顺序消费
  • 解耦:解决生产消费强依赖
  • 解决生产者消费者速率不对等的问题(其实也算解耦)
ArrayBlockingQueue

数组实现的阻塞队列,初始化大小后无法修改。

LinkedBlockingQueue

链表实现的阻塞队列,默认大小Inter.MAX_VALUE。

DelayQueue

延迟队列,元素必须实现Delayed接口。

SynchronousBlockingQueue

队列中不存储任何元素,传入元素必须等被取走后才能继续传入,类似于一个阻塞的中转站,强制两边同步。

PriorityBlockingQueue

无界的并发队列,可以按照Priority排序,类似堆结构,可以称为优先队列。

原子操作

原子操作基于CAS实现,预期值要记得使用getIntVolatile()方法拿到

推荐阅读