生产者消费者问题(生产者和消费者分别阻塞于不同的锁)

简介: 生产者消费者问题(生产者和消费者分别阻塞于不同的锁)

公众号merlinsea


背景介绍:


   之前介绍了生产者消费者阻塞在同一把this锁的解决方案,但那个方案会导致生产者和消费者互斥,即生产者生产的时候消费者不能进行消费或者消费者消费的时候生产者不能进行生产,为了解决这个问题,故提出了如下解决方案。


生产者消费者问题介绍

奔跑的小梁,公众号:梁霖编程工具库生产者消费者问题(生产者和消费者都阻塞于同一把锁this锁)


利用condition优化之前的生产者和消费者问题

特点:

1、生产者生产的时候消费者不能消费,消费者消费的时候生产者不能生产

2、生产者和消费者分别阻塞于不同的锁

640.jpg


中间商Medium

/**
 * 中间商
 */
public class Medium {
    private int num = 0;
    private static final int TOTAL = 20;
    private Lock lock = new ReentrantLock();
    private Condition consumerCondition = lock.newCondition();
    private Condition producerCondition = lock.newCondition();
    /**
     * 接收生产数据
     */
    public void put() {
        lock.lock();
        try {
            //判断当前库存,是否已经是最大的库存容量,
            if (num < TOTAL) {
                num++;
                System.out.println(Thread.currentThread().getName()+" 生产者 新增库存:" +num);
                // 如果不是,生产完成之后,通知消费者进行消费
                try {
                    Thread.sleep(500L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                consumerCondition.signalAll();
            } else {
                // 如果是,则通知生产者进行等待,
                try {
                    System.out.println(Thread.currentThread().getName()+" 生产者 库存已满:" + num);
                    producerCondition.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        } finally {
            lock.unlock();
        }
    }
    /**
     * 获取消费数据
     */
    public void take() {
        lock.lock();
        try {
            //判断当前库存是否不足
            if (num > 0) {
                //如果充足,在消费完成之后,通知生产者进行生产
                num--;
                System.out.println(Thread.currentThread().getName()+" 消费者 消费库存:" + num);
                try {
                    Thread.sleep(1000L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                producerCondition.signalAll();
            } else {
                //如果不足,通知消费者暂停消费
                try {
                    System.out.println(Thread.currentThread().getName()+" 消费者 库存不足:" + num);
                    consumerCondition.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        } finally {
            lock.unlock();
        }
    }
}


消费者consumer

/**
 * 消费者
 */
public class Consumer implements Runnable{
    private Medium medium;
    public Consumer( Medium medium) {
        this.medium = medium;
    }
    @Override
    public void run() {
        while (true) {
            medium.take();
        }
    }
}


生产者producer

/**
 * 生产者
 */
public class Producer implements Runnable{
    private Medium medium;
    public Producer(Medium medium) {
        this.medium = medium;
    }
    @Override
    public void run() {
        while (true) {
            medium.put();
        }
    }
}


main函数

public class Main {
    public static void main(String[] args) {
        Medium medium = new Medium();
        new Thread(new Consumer(medium)).start();
        new Thread(new Consumer(medium)).start();
        new Thread(new Producer(medium)).start();
        new Thread(new Producer(medium)).start();
        new Thread(new Producer(medium)).start();
        new Thread(new Producer(medium)).start();
    }
}


vip算法班永久学习班: 800元/人

周一、周三、周五:8:30-9:30,周六、周日:10:30-11:30

报名方式:通过公众号导航栏的刷题群即可联系到我的微信号

vip算法班详情链接

奔跑的小梁,公众号:梁霖编程工具库算法训练营快来参加吧~
相关文章
|
5月前
|
容器
多线程学习之生产者和消费者与阻塞队列的关系
多线程学习之生产者和消费者与阻塞队列的关系
22 0
|
7月前
|
安全 API C++
c++生产者和消费者线程循环
线程安全-生产者消费者模型
75 1
|
9月前
|
算法
生产者消费者问题(生产者和消费者都阻塞于同一把锁this锁)
生产者消费者问题(生产者和消费者都阻塞于同一把锁this锁)
|
11月前
|
数据可视化
高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析
高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析
36 0
|
11月前
|
安全 Java
【JUC基础】06. 生产者和消费者问题
学习JUC,就不得不提生产者消费者。生产者消费者模型是一种经典的多线程模型,用于解决生产者和消费者之间的数据交换问题。在生产者消费者模型中,生产者生产数据放入共享的缓冲区中,消费者从缓冲区中取出数据进行消费。在这个过程中,生产者和消费者之间需要保持同步,以避免数据出现错误或重复。今天我们就来说说生产者消费者模型,以及JUC中如何解决该模型的同步问题。
127 0
|
安全 数据处理
线程中的生产者和消费者模式
线程中的生产者和消费者模式
100 0
线程中的生产者和消费者模式
|
安全 Java
Java多线程——生产者/消费者问题
生产者/消费者问题
144 0
基于阻塞队列实现的简单生产者-消费者模式
基于阻塞队列实现的简单生产者-消费者模式
89 0