生产者消费者ReentrantLock+Condition的传统实现demo

/**
 * @ClassName ProdConsumer_TraditionDemo
 * @Description 模拟生产者消费者模式
 *
 *  让两个线程对一个初始变量0,一个加1一个减1 模拟生产者消费者
 *
 *  1 线程  操作  资源类
 *  2 判断  干活  通知
 *  3 防止虚假唤醒机制
 **/

// 资源类
class ShareData{
    private int number = 0;
    private Lock lock = new ReentrantLock();
    private Condition condition = lock.newCondition();

    //加温度/生产
    public void increment() throws Exception{
        lock.lock();
        try{
            // 判断
            //使用while不使用if的原因是,if在只有两个线程的时候没有问题,一个唤醒另一个必然满足判断
            //条件往下执行,但是当有多个线程大于2的时候比如有两个消费者线程都在等待那么一旦唤醒
            //两个线程都会往下走那么就会产生并发问题,而使用while在唤醒时 while会再去判断一次
            //是否满足
            while(number != 0){
                // 等待 不能生产
                condition.await();
            }
            // 干活
            number++;
            System.out.println(Thread.currentThread().getName() + "\t" + number);
            // 通知唤醒
            condition.signalAll();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }
    //减温度/消费
    public void decrement() throws Exception{
        lock.lock();
        try{
            // 判断
            while(number == 0){
                // 等待 不能生产
                condition.await();
            }
            // 干活
            number--;
            System.out.println(Thread.currentThread().getName() + "\t" + number);
            // 通知唤醒
            condition.signalAll();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }
}
public class ProdConsumer_TraditionDemo {
    public static void main(String[] args) {
        ShareData shareData = new ShareData();
        new Thread(() ->{
            for (int i = 1; i <= 5; i++) {
                try {
                    shareData.increment();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        },"AA").start();

        new Thread(() ->{
            for (int i = 1; i <= 5; i++) {
                try {
                    shareData.decrement();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        },"BB").start();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值