Java并发工具包——BlockingQueue(一)

Java并发工具包——BlockingQueue(一)

这期继续Java并发包的介绍,之前介绍了一些简单的并发工具,这一期说一个相对复杂的工具(阻塞队列)。

简介

阻塞队列很容易理解,就是在特殊的情况下处在阻塞状态。

  • 队列处于满的状态,阻塞入队列的操作
  • 队列处于空的状态,阻塞出队列的操作
- Throws Exception Special Value Blocks Times Out
insert add(o) offer(o) put(o) offer(o, timeout, timeunit)
remove remove(o) poll() take() poll(timeout, timeunit)
examine element() peek()
  • 抛异常:阻塞队列满/空的时候,入队add出队remove操作都会触发异常
  • 特殊值:入队操作——true or false,出队操作——obj or null
  • 常阻塞:阻塞队列满/空的时候,入队put出队take操作都会一直阻塞
  • 超时:阻塞队列满/空的时候,入队出队操作一直阻塞到超时的设定时间

由于BlockingQueue的实现很多,这期就说一个比较简单的数组实现的有界阻塞队列——ArrayBlockingQueue。

应用场景

ArrayBlockingQueue是由数组实现的有界阻塞队列。在读写操作上都需要锁住整个容器,所以性能上一般,常用于实现“生产者消费者”模式,秒杀场景可以起到服务端流量削峰的作用,减轻服务器瞬时压力。

实例

生产者消费者


输出


原理

ArrayBlockingQueue作为一个BlockingQueue的实现类,通过ReentrantLock实现put和offer两个方法的阻塞功能


put方法

offer方法

抛出异常的方法实现


add方法

remove方法

总结

ArrayBlockingQueue实现BlockingQueue中规中矩,适合于各种普通的需要用到队列的场景,但是对于性能要求较高,或者有优先级功能的话就没有办法很好的实现了。

你可能感兴趣的:(Java并发工具包——BlockingQueue(一))