知识卡片

阻塞队列管背压

普通读书笔记卡 · 1533

内容

BlockingQueue 不只是线程安全队列,还把”队列空/满时怎么办”变成阻塞语义:满时添加线程阻塞直到不满,空时删除线程阻塞直到不空。这与普通队列(ArrayDeque)满/空时直接抛异常形成对比。生产者和消费者通过 put/take 自然产生等待,不需要像 [[等待条件必须循环复查]] 那样手写 wait/notify;线程池工作队列都依赖它把速度差转化为有界排队。

参考来源

- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第7章《JUC容器类》7.4.1节《BlockingQueue的特点》(源文件:_epub-src/OEBPS/Text/chapter239.xhtml) - 结论依据:原文明确“阻塞队列与普通队列(ArrayDeque等)之间的最大不同点在于阻塞队列提供了阻塞式的添加和删除方法”,并分别定义阻塞添加(队列满时阻塞添加线程,队列不满时唤醒)和阻塞删除(队列空时阻塞删除线程,队列不空时唤醒),因此推出本卡结论。 - 原始内容:阻塞队列与普通队列(ArrayDeque等)之间的最大不同点在于阻塞队列提供了阻塞式的添加和删除方法……阻塞添加是指当阻塞队列元素已满时,队列会阻塞添加元素的线程,直到队列元素不满时,才重新唤醒线程执行元素添加操作……阻塞删除是指在队列元素为空时,删除队列元素的线程将被阻塞,直到队列不为空时,才重新唤醒删除线程,再执行删除操作。