Dorck's Blog
修技术之道,日三省吾身 | App Dev & Freelance Thinker & Hacker Growth | 这里是 @道轲(Dorck) 的个人博客,与你一起探寻世界。
马上订阅 Dorck's Blog RSS 更新: https://dorck.cn/feed.xml
回顾Java中经典的生产/消费者模型
概述
生产者-消费者模型是 Java 并发编程中比较常见的加锁应用场景之一,以下是维基百科的对于该名词的定义:
生产者消费者问题(Producer-consumer problem),也称有限缓冲问题(Bounded-buffer problem),是一个多进程同步问题的经典案例。该问题描述了共享固定大小缓冲区的两个进程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。
问题分析

结合上图及定义我们可以提取出该模型具有以下特点:
- 生产者和消费者可以同时并发运作
- 缓冲区满则阻塞等待消费者消费数据
- 缓冲区空则阻塞等待生产者生产数据
我们知道,生产者和消费者可以同时运作,并且二者执行效率和规模也很有可能出现严重的不对等性。那么为了保证生产和消费操作的原子性和共享数据的可见性,我们需要借助一种同步机制来保障该模型的正常运行。
实现方式
以下来介绍几种常见的生产-消费模型的实现方式。
1. synchorized + wait/notify
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class GoodsStorageDispatcher {
// 仓库容纳上限
private static final int MAX_SIZE = 100;
// 仓库容纳的货物集合
private LinkedList<Good> list = new LinkedList(...剩余内容已隐藏
查看完整文章以阅读更多Dorck's Blog
修技术之道,日三省吾身 | App Dev & Freelance Thinker & Hacker Growth | 这里是 @道轲(Dorck) 的个人博客,与你一起探寻世界。
马上订阅 Dorck's Blog RSS 更新: https://dorck.cn/feed.xml
回顾Java中经典的生产/消费者模型
2023年4月29日 19:00多线程BlockingQueue概述
生产者-消费者模型是 Java 并发编程中比较常见的加锁应用场景之一,以下是维基百科的对于该名词的定义:
生产者消费者问题(Producer-consumer problem),也称有限缓冲问题(Bounded-buffer problem),是一个多进程同步问题的经典案例。该问题描述了共享固定大小缓冲区的两个进程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。
问题分析

结合上图及定义我们可以提取出该模型具有以下特点:
- 生产者和消费者可以同时并发运作
- 缓冲区满则阻塞等待消费者消费数据
- 缓冲区空则阻塞等待生产者生产数据
我们知道,生产者和消费者可以同时运作,并且二者执行效率和规模也很有可能出现严重的不对等性。那么为了保证生产和消费操作的原子性和共享数据的可见性,我们需要借助一种同步机制来保障该模型的正常运行。
实现方式
以下来介绍几种常见的生产-消费模型的实现方式。
1. synchorized + wait/notify
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class GoodsStorageDispatcher {
// 仓库容纳上限
private static final int MAX_SIZE = 100;
// 仓库容纳的货物集合
private LinkedList<Good> list = new LinkedList(...剩余内容已隐藏
查看完整文章以阅读更多