1. 生产者-消费者模式深度解析
生产者-消费者模式是并发编程中的经典范式,其核心思想是通过解耦生产数据和消费数据的过程来提升系统整体吞吐量。我在实际开发中发现,90%的线程同步问题都可以通过这个模式优雅解决。
1.1 模式工作原理图解
想象一个包子铺场景:厨师(生产者)不断将做好的包子放入蒸笼(缓冲区),顾客(消费者)从蒸笼取用包子。当蒸笼满时厨师需要等待,蒸笼空时顾客需要等待——这就是最直观的生产者-消费者模型。
技术实现上包含三个关键组件:
- 生产者线程:生成数据单元放入缓冲区
- 缓冲区:线程共享的队列结构(通常有容量限制)
- 消费者线程:从缓冲区取出数据单元处理
python复制from threading import Thread, Condition
import time
import random
queue = []
MAX_ITEMS = 5
condition = Condition()
class ProducerThread(Thread):
def run(self):
nums = range(5)
global queue
while True:
condition.acquire()
if len(queue) == MAX_ITEMS:
print("队列已满,生产者等待")
condition.wait()
print("有空间了,生产者继续")
num = random.choice(nums)
queue.append(num)
print("生产", num)
condition.notify()
condition.release()
time.sleep(random.random())
1.2 同步机制的选择策略
Java中常见的同步方案对比:
| 同步方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| synchronized | 语法简单 | 功能有限 | 简单同步需求 |
| ReentrantLock | 可中断、超时、公平锁 | 需手动释放 | 复杂同步控制 |
| BlockingQueue | 内置缓冲队列 | 定制性较差 | 标准生产者-消费者 |
| Semaphore | 灵活控制并发数 | 需组合使用 | 资源池管理 |
经验提示:在Java生态中,BlockingQueue的实现类如ArrayBlockingQueue已经内置了线程安全机制,建议优先考虑。我在电商订单系统中实测,使用LinkedBlockingQueue比手动实现同步逻辑性能提升40%,且代码量减少60%。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 并行任务调度实战方案
2.1 任务分片的核心算法
有效的并行调度需要解决任务划分和负载均衡两个关键问题。以图像处理为例,假设我们需要对1000张图片进行滤镜处理:
java复制// 伪代码展示分片逻辑
int totalTasks = 1000;
int availableCores = Runtime.getRuntime().availableProcessors();
int batchSize = (totalTasks + availableCores - 1) / availableCores;
List<Future> futures = new ArrayList<>();
for (int i = 0; i < availableCores; i++) {
int start = i * batchSize;
int end = Math.min((i + 1) * batchSize, totalTasks);
futures.add(executor.submit(new ImageProcessor(start, end)));
}
实际应用中需要考虑分片的三个维度:
- 数据分片:按数据范围划分(如SQL的limit offset)
- 特征分片:按业务特征划分(如用户地域)
- 流水线分片:按处理阶段划分
