求解java多线程生产者消费者问题

执行下面这一段代码, 会出现idea死锁的情况, 但是我不知道为什么,求解

// 仓库里面食物只能存放一个. cnt = 0的时候生产, cnt = 1的时候消费
public class Container {
    private volatile int cnt = 0;

    public synchronized void push(){
        if(cnt == 1){

            try {

                wait();

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        else{// 如果去掉else{}只留下{}里面的内容执行就会成功。不产生死锁
            cnt++;
            System.out.println(Thread.currentThread().getName()+"生产了"+cnt);
            notifyAll();

        }
    }

    public synchronized void pop(){
        if (cnt == 0){

            try {

                wait();
                System.out.println("pop 里面 cnt = "+ cnt);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
        else {// 如果去掉else{}只留下{}里面的内容执行就会成功。不产生死锁
            cnt--;
            System.out.println(Thread.currentThread().getName()+"消费了"+cnt);
            notifyAll();

        }

    }
}

// 主函数
public class DemoTest {
    public static void main(String[] args) {

        Container container = new Container();

        new Thread(()->{
            for (int i = 0; i < 10; i++) {

                container.push();
            }
        }, "生产者1号 ").start();

        new Thread(()->{
            for (int i = 0; i < 10; i++) {

                container.pop();
            }
        }, "消费者1号 ").start();
    }
}
#Java开发##java工程师##学习路径#
全部评论
锁的对象不同
点赞 回复 分享
发布于 2021-05-26 19:46

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务