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),是一个多进程同步问题的经典案例。该问题描述了共享固定大小缓冲区的两个进程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。

问题分析

java_producer_consumer

结合上图及定义我们可以提取出该模型具有以下特点:

  • 生产者和消费者可以同时并发运作
  • 缓冲区满则阻塞等待消费者消费数据
  • 缓冲区空则阻塞等待生产者生产数据

我们知道,生产者和消费者可以同时运作,并且二者执行效率和规模也很有可能出现严重的不对等性。那么为了保证生产和消费操作的原子性和共享数据的可见性,我们需要借助一种同步机制来保障该模型的正常运行。

实现方式

以下来介绍几种常见的生产-消费模型的实现方式。

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(...

剩余内容已隐藏

查看完整文章以阅读更多