队列名称 | 是否可以控制队列容量 | 底层数据结构 | 加锁方式 | 特点 |
---|---|---|---|---|
ArrayBlockingQueue | 可以 | 数组 | ReentrantLock | 1、厨师炒好菜,发现餐台有位置,直接把菜放到餐台,同时唤醒正在等待的服务员; 2、厨师炒好菜,发现餐台没有位置,则等待; 3、服务员来取菜,发现有菜,则取菜,并唤醒正在等待的厨师; 4、服务员来取菜,发现没有菜,则等待; |
LinkedBlockingQueue | 可以 | 单向链表 | ReentrantLock | 1、厨师炒好菜,发现餐台有位置,直接把菜放到餐台,同时唤醒正在等待的服务员; 2、厨师炒好菜,发现餐台没有位置,则等待; 3、服务员来取菜,发现有菜,则取菜,并唤醒正在等待的厨师; 4、服务员来取菜,发现没有菜,则等待; |
LinkedBlockingDeque | 可以 | 双向链表 | ReentrantLock | 1、厨师炒好菜,发现餐台有位置,直接把菜放到餐台,同时唤醒正在等待的服务员; 2、厨师炒好菜,发现餐台没有位置,则等待; 3、服务员来取菜,发现有菜,则取菜,并唤醒正在等待的厨师; 4、服务员来取菜,发现没有菜,则等待; |
LinkedTransferQueue | 不可以 | 单向链表 | ReentrantLock | 1、厨师炒好菜,发现餐台有位置,直接把菜放到餐台,同时唤醒正在等待的服务员; 2、厨师炒好菜,发现餐台没有位置,则等待; 3、服务员来取菜,发现有菜,则取菜,并唤醒正在等待的厨师; 4、服务员来取菜,发现没有菜,则等待; 5、厨师炒好菜,发现有服务员在等待,则直接把菜给服务员; |
PriorityBlockingQueue | 不可以 | 堆 | ReentrantLock | 1、厨师炒好菜,发现餐台有位置,直接把菜按照一定顺序放到餐台,同时唤醒正在等待的服务员; 2、厨师炒好菜,发现餐台没有位置,则等待; 3、服务员来取菜,发现有菜,则取菜,并唤醒正在等待的厨师; 4、服务员来取菜,发现没有菜,则等待; |
DelayQueue | 不可以 | 堆 | ReentrantLock | 1、厨师炒好菜,发现餐台有位置,直接把菜按照一定顺序放到餐台,同时唤醒正在等待的服务员; 2、厨师炒好菜,发现餐台没有位置,则等待; 3、服务员来取菜,发现有菜,则看下当前菜是否到时间,到时间则取菜,并唤醒正在等待的厨师;没到时间,自旋等待 4、服务员来取菜,发现没有菜,则等待; |
ConcurrentLinkedQueue | 不可以 | 单向链表 | cas | 1、厨师炒好菜,发现餐台有位置,直接把菜放到餐台; 2、厨师炒好菜,发现餐台没有位置,则自旋; 3、服务员来取菜,发现有菜,则取菜; 4、服务员来取菜,发现没有菜,则自旋; |
ConcurrentLinkedDeque | 不可以 | 双向链表 | cas | 1、厨师炒好菜,发现餐台有位置,直接把菜放到餐台; 2、厨师炒好菜,发现餐台没有位置,则自旋; 3、服务员来取菜,发现有菜,则取菜; 4、服务员来取菜,发现没有菜,则自旋; |
SynchronousQueue | 容量为0 | ReentrantLock | 1、厨师炒好菜,发现没服务员,则等待服务员; 2、服务员来取菜,发现没厨师,则等待厨师; |
网友评论