首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于Lock+Condition实现生产者消费者模式

基于Lock+Condition实现生产者消费者模式

作者头像
程裕强
发布于 2022-05-06 11:39:35
发布于 2022-05-06 11:39:35
19600
代码可运行
举报
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package demo;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

//产品仓库类
class Storage {
    private int maxSize; // 缓冲区大小
    private List<Object> buffer;
    private final Lock lock = new ReentrantLock(true);
    private final Condition condition = lock.newCondition();

    public Storage(int maxSize){
        this.maxSize =maxSize;
        buffer=new ArrayList<>();
    }
    // 写操作,生产一个产品
    public void put() {
        try {
            lock.lock();
            while (buffer.size() == maxSize) {
                System.out.println(Thread.currentThread().getName() + " Producer wait! ");
                condition.await();
            }
            buffer.add(new Object());
            System.out.println(Thread.currentThread().getName() + ":存入一个产品,现在产品数=" + buffer.size());
            condition.signalAll(); // 通知消费者
        } catch (InterruptedException e) {
            System.out.println(e);
        } finally {
            // 释放锁
            lock.unlock();
        }
    }

    // 读操作,消费一个产品
    public void get() {
        lock.lock();// 加锁
        try {
            while (buffer.isEmpty()) { // 缓冲区空了
                System.out.println(Thread.currentThread().getName() + " Consumer wait!");
                condition.await();
            }
            // 消费一个产品
            buffer.remove(0); // 从链表头部移除一个
            System.out.println(Thread.currentThread().getName() + ":取出一个产品,现在产品数=" + buffer.size());
            condition.signalAll();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
}
//生产者
class Producer implements Runnable {
    private Storage storage;
    public Producer(Storage storage) {
        this.storage = storage;
    }
    @Override
    public void run() {
        storage.put();
    }
}
//消费者
class Consumer implements Runnable {
    private Storage storage;
    public Consumer(Storage storage) {
        this.storage = storage;
    }

    @Override
    public void run() {
        storage.get();
    }
}

public class ProducerConsumerDemo {

    public static void main(String[] args) {
        Storage storage=new Storage(5);
        //10个生产者
        for(int i=0;i<10;i++){
            new Thread(new Producer(storage)).start();
        }
        //5个消费者
        for(int i=0;i<5;i++){
            new Thread(new Consumer(storage)).start();
        }
    }

}

运行结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Thread-0:存入一个产品,现在产品数=1
Thread-1:存入一个产品,现在产品数=2
Thread-3:存入一个产品,现在产品数=3
Thread-2:存入一个产品,现在产品数=4
Thread-4:存入一个产品,现在产品数=5
Thread-5 Producer wait! 
Thread-6 Producer wait! 
Thread-7 Producer wait! 
Thread-8 Producer wait! 
Thread-9 Producer wait! 
Thread-10:取出一个产品,现在产品数=4
Thread-5:存入一个产品,现在产品数=5
Thread-6 Producer wait! 
Thread-7 Producer wait! 
Thread-8 Producer wait! 
Thread-9 Producer wait! 
Thread-11:取出一个产品,现在产品数=4
Thread-12:取出一个产品,现在产品数=3
Thread-6:存入一个产品,现在产品数=4
Thread-7:存入一个产品,现在产品数=5
Thread-8 Producer wait! 
Thread-9 Producer wait! 
Thread-13:取出一个产品,现在产品数=4
Thread-14:取出一个产品,现在产品数=3
Thread-8:存入一个产品,现在产品数=4
Thread-9:存入一个产品,现在产品数=5
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-01-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java实现生产者消费者的两种方式(r12笔记第66天)
我在8年前去面试程序员的时候,一个不大的公司,里面的开发主管接待了我们,给我的题目就是写一段程序模拟生产者消费者问题,当时可把我难坏了,一下子感觉自己的知识储备竟然如此的匮乏。 而在我从事DBA工作之后,经常会有大批量并发的环境,有的需要排障,有的需要优化,在很多并发的场景中,发现生产者消费者问题可以模拟出很多实际中的问题,所以生产者消费者问题非常重要,也是我想不断改进和探索的一类问题。 引入仓库的必要性 要想使用程序来模拟,其实也不用花太多的时间,我们简单说说需要考虑的地方。首先生产者,
jeanron100
2018/03/21
8250
Carson带你学Java:解决生产者、消费者问题的五种实现方式
1. 简介 生产者 & 消费者之间存在 强耦合问题 2. 解决方案 采用 生产者 & 消费者 模式,具体介绍如下: 3. 具体解决方式介绍 方式1:wait() / notify() // Object类里的两个方法,所有Object子类都可使用这2个方法 // 对象的监视器对锁对象的锁定(也就是代码中的lock对象),注意是调用锁对象的wait() / nofity() public class Test { private static Integer count = 0;
Carson.Ho
2021/12/06
2530
Carson带你学Java:解决生产者、消费者问题的五种实现方式
Java并发-定义锁以及消费者-生产者模式实现
 对于Java并发的锁结构,我们常常使用的是synchonized结构,而由于其灵活度较低,所以在Java-5后提出了Lock接口,以及AbstractQueuedSynchronizer抽象类供我们方便且安全地来实现自定义锁结构,下面从代码出发来开始这篇文章的阅读。
Fisherman渔夫
2020/02/17
5960
JUC包下的CountDownLatch,CyclicBarrier,Semaphore
①.从CountDownLatch的设计来看,可以做汇总的操作,例如计算员工工资,这边启动多个线程同时计算等所有线程执行完毕之后,计算需要发放的总额 final ConcurrentHashMap<String, Integer> resultMap = new ConcurrentHashMap<String, Integer>(); final CountDownLatch c = new CountDownLatch(10); final Random r = new Random();
用户1215919
2018/02/27
5370
Java—多线程实现生产消费者
代码说明:Resource中使用synchronized代码块儿进行加锁的操作,线程需要等待的时候使用wait()方法进行等待操作,唤醒使用notify()方法进行唤醒,需要注意的是notify()唤醒是对其他等待线程进行随机唤醒操作,所以在TestMain中只设置了一个生产类和一个消费类,这都是有意而为之的。 存在问题: 如果我们的共有资源只有一份的时候并且存在多个消费者和生产者的时候,以上的代码就会出现问题。为什么呢?因为notify()是随机唤醒一个等待线程,可能消费者线程还会唤醒一个消费者线程,同理可能生产线程还会唤醒一个生产线程,所以在只有一份资源的情况下,就可能多次消费或者多次生产的情况,那么怎么解决这个问题呢?看下文version2。
科技新语
2024/12/25
1250
Java—多线程实现生产消费者
读书笔记《Java并发编程的艺术 - 方腾飞》- AQS及相关内容
源码位置 : java.util.concurrent.locks.AbstractQueuedSynchronizer
星尘的一个朋友
2020/11/25
3580
读书笔记《Java并发编程的艺术 - 方腾飞》- AQS及相关内容
线程通讯之消费者和生产者传统版
lock更加牛逼一点所以一班我们用lock,其实设计方法 话不多说,直接code
名字是乱打的
2022/05/13
2080
线程通信的生产者消费者模式
小知识:在多线程里不要用if,使用while判断,防止虚假唤醒 普通版: package com.an.learning.thread; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class ShareData{ // 资源类 private int number = 0
余生大大
2022/11/02
2690
线程通信的生产者消费者模式
Java实现生产者消费者
生产/消费者问题是个非常典型的多线程问题,涉及到的对象包括“生产者”、“消费者”、“仓库”和“产品”。他们之间的关系如下: (01) 生产者仅仅在仓储未满时候生产,仓满则停止生产。 (02) 消费者仅仅在仓储有产品时候才能消费,仓空则等待。 (03) 当消费者发现仓储没产品可消费时候会通知生产者生产。 (04) 生产者在生产出可消费产品时候,应该通知等待的消费者去消费。
说故事的五公子
2020/04/10
7120
用java语言实现生产者消费者问题[Java生产者消费者模型一对一]
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说用java语言实现生产者消费者问题[Java生产者消费者模型一对一],希望能够帮助大家进步!!!
Java架构师必看
2022/02/28
5610
用java语言实现生产者消费者问题[Java生产者消费者模型一对一]
多线程 - 生产者消费者模式
通过生产者消费者模式的编写,可以了解线程间的通信问题,通过condition的signal和await进行唤醒和等待比wait和notify更好,因为signal和await可以针对特定的线程进行唤醒和等待,比notifyAll更安全。
承苏凯
2020/07/24
4570
多线程 - 生产者消费者模式
一文带你读懂生产者和消费者模型
在 Java 多线程编程中,还有一个非常重要的设计模式,它就是:生产者和消费者模型。
Java极客技术
2023/11/16
1.8K0
一文带你读懂生产者和消费者模型
【JUC基础】06. 生产者和消费者问题
学习JUC,就不得不提生产者消费者。生产者消费者模型是一种经典的多线程模型,用于解决生产者和消费者之间的数据交换问题。在生产者消费者模型中,生产者生产数据放入共享的缓冲区中,消费者从缓冲区中取出数据进行消费。在这个过程中,生产者和消费者之间需要保持同步,以避免数据出现错误或重复。今天我们就来说说生产者消费者模型,以及JUC中如何解决该模型的同步问题。
有一只柴犬
2024/01/25
2200
【JUC基础】06. 生产者和消费者问题
Java生产者消费者的三种实现
Java生产者消费者是最基础的线程同步问题,java岗面试中还是很容易遇到的,之前没写过多线程的代码,面试中被问到很尬啊,面完回来恶补下。在网上查到大概有5种生产者消费者的写法,分别如下。
xindoo
2021/01/21
2.4K0
ReentrantLock实现原理
建议和上一篇分享结合着看:深入理解AbstractQueuedSynchronizer
Java识堂
2019/08/13
4730
Java多线程系列——Lock锁
Java多线系列文章是Java多线程的详解介绍,对多线程还不熟悉的同学可以先去看一下我的这篇博客Java基础系列3:多线程超详细总结,这篇博客从宏观层面介绍了多线程的整体概况,接下来的几篇文章是对多线程的深入剖析。
说故事的五公子
2019/12/10
1.4K0
Java多线程系列——Lock锁
生产者/消费者问题
    生产者消费者模型具体来讲,就是在一个系统中,存在生产者和消费者两种角色,他们通过内存缓冲区进行通信(解耦),生产者将消费者需要的资源生产出来放到缓冲区,消费者把从缓冲区把资源拿走消费。
Java学习录
2019/04/18
6630
Android 面试必备 - 线程
java thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明:
程序员徐公
2020/01/13
5390
Java实现生产者消费者问题
实现一个队列。 队列的应用场景为: 一个生产者线程将int类型的数入列,一个消费者线程将int类型的数出列 image.png 1、Consumer.java package com.week.pv; import java.util.LinkedList; import java.util.List; import java.util.Queue; /** * 消费者 * @author xingqijiang */ public class Consumer implements Runn
week
2018/08/24
4830
Java实现生产者消费者问题
【Java 基础篇】Java Condition 接口详解
Java 提供了一种更灵活和高级的线程协作机制,通过 Condition 接口的使用,你可以更精细地控制线程的等待和唤醒,实现更复杂的线程同步和通信。本文将详细介绍 Java 的 Condition 接口,包括它的基本概念、常见用法以及注意事项。
繁依Fanyi
2023/10/12
5090
【Java 基础篇】Java Condition 接口详解
相关推荐
Java实现生产者消费者的两种方式(r12笔记第66天)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档