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

put方法
offer方法
add方法
remove方法










网友评论