传统Synchronized下的生产者和消费者模式

package com.xiaozhao.juc;


//生产者——消费者模式(Producer Consumer Model)
public class PCM {
    public static void main(String[] args) {
        Data data = new Data();
        new Thread(()->{
            for (int i = 0; i < 20; i++) {
                try {
                    data.increment();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"A").start();

        new Thread(()->{
            for (int i = 0; i < 20; i++) {
                try {
                    data.decrement();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"B").start();

        new Thread(()->{
            for (int i = 0; i < 20; i++) {
                try {
                    data.increment();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"C").start();
        new Thread(()->{
            for (int i = 0; i < 20; i++) {
                try {
                    data.decrement();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"D").start();
    }
}


//线程先根据条件判断是否需要等待——>执行业务——>通知其他线程
class Data{
    private int number = 0;

    public synchronized void increment() throws InterruptedException {

        //这里如果是If就会造成虚假唤醒问题,为了防止虚假唤醒必须用while----官方推荐
        while (number != 0){
            //等待
            this.wait();
        }
        number++;
        System.out.println(Thread.currentThread().getName()+"——>"+number);
        //通知其他线程,我执行+1完毕
        this.notifyAll();
    }

    public synchronized void decrement() throws InterruptedException {
        //这里如果是If就会造成虚假唤醒问题,为了防止虚假唤醒必须用while----官方推荐
        while (number == 0){
            //等待
            this.wait();
        }
        number--;
        System.out.println(Thread.currentThread().getName()+"——>"+number);
        //通知其他线程,我执行-1完毕
        this.notifyAll();
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43562937/article/details/106965086