生产消费模型的特点以及应用场景
此处同步机制采用基础锁机制,用 synchronized 锁保护缓冲区,搭配 wait() / notify() 控制生产和消费的时机,是最经典的实现方式。生产消费模型是一种通过“生产者”生成数据/资源,“消费者”处理数据/资源,并借助“缓冲区”协调两者速度差异的设计模式。数据存入缓冲区后,同步机制会通知等待的消费者(如调用notify()、释放信号量),告知“缓冲区有新数据可处理”。:暂存生产者
1.模型概念
生产消费模型是一种通过“生产者”生成数据/资源,“消费者”处理数据/资源,并借助“缓冲区”协调两者速度差异的设计模式。它的核心要素如下:
-生产者:负责产生数据。
-消费者:负责处理数据。
-缓冲区:暂存生产者生成的数据,避免生产者因消费者处理慢而等待,或消费者因生产者生成慢而空闲。
-同步机制:保证缓冲区操作的线程安全,避免“生产者多存、消费者多取”或“缓冲区空/满时操作”的问题。
2.核心流程
1. 生产者启动与数据生成
生产者线程开始运行,生成数据准备存入缓冲区。
2. 同步检查与数据存入
生产者通过同步机制检查缓冲区:
- 若缓冲区未满,直接将数据存入缓冲区;
- 若缓冲区已满,生产者进入阻塞状态,等待缓冲区有空位后被唤醒。
3. 缓冲区暂存与状态通知
数据存入缓冲区后,同步机制会通知等待的消费者(如调用notify()、释放信号量),告知“缓冲区有新数据可处理”。
public class Producer implements Runnable {
//保存数据的仓库
public List<Product> list;
//设置仓库上限
public int max = 5;
public Producer(List<Product> list) {
this.list = list;
}
public void run() {
while (true) {
synchronized (list) {
//检查仓库容量
while (list.size() >= max) {//仓库已满
//生产者线程进入等待状态
try {
list.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
//生产数据,唤醒消费者
Product product = new Product();
list.add(product);
System.out.println("生产");
list.notify();
try {
list.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
}
此处同步机制采用基础锁机制,用 synchronized 锁保护缓冲区,搭配 wait() / notify() 控制生产和消费的时机,是最经典的实现方式。
4. 消费者同步检查与数据取出
消费者线程通过同步机制检查缓冲区:
- 若缓冲区非空,从缓冲区取出数据;
- 若缓冲区为空,消费者进入阻塞状态,等待缓冲区有数据后被唤醒。
5. 数据处理与循环
消费者处理取出的数据,处理完成后回到步骤4,继续等待下一批数据;同时,生产者回到步骤2,继续生成新数据,形成循环。
public class Consumer implements Runnable {
public List<Product> list;
public Consumer(List<Product> list) {
this.list = list;
}
public void run() {
while (true) {
synchronized (list) {
while (list.isEmpty()) {
try {
list.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
list.remove(list.size() - 1);
System.out.println("消费");
list.notify();
try {
list.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
}
3.应用场景
生产消费模型的核心应用场景在于解决数据生成与处理在速度、频率或并发上的不匹配问题,主要可分为以下四类:
1.异步任务处理
适用于需要提交任务后立即返回、无需等待结果的场景,避免主线程阻塞。
应用:用户注册时,主线程快速返回"注册中"提示,后台异步处理发送验证邮件、数据入库等操作。
2.流量削峰填谷
应对突发流量场景,通过缓冲区平抑峰值压力。
应用:电商秒杀活动时,将瞬时订单请求暂存消息队列,后台系统按处理能力逐步消化,保障系统稳定性。
3.模块解耦
降低系统模块间的直接依赖,支持独立演进。
应用:游戏开发中,敌人生成模块与AI处理、渲染模块通过共享队列交互,各模块可独立升级优化。
4.批量处理优化
适用于高频产生但处理成本高的场景,通过批量操作提升效率。
应用:日志系统累计100条日志后批量写入数据库,显著减少I/O操作次数。
更多推荐
所有评论(0)