java中Debug 与 测试类运行结果不同

今天做了一个案例,生产者与消费者
public class BoxDemo {
    public static void main(String[] args) {
        Box b = new Box();

        Producer p = new Producer(b);

        Customer c = new Customer(b);

        Thread t1 = new Thread(p);
        Thread t2 = new Thread(c);


        t1.start();
        t2.start();

    }
}
public class Box {
    private int milk;
    private boolean state = false;

    public synchronized void put(int milk) {
        this.milk = milk;
        if (state) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
        System.out.println("送奶工将第" + this.milk + "瓶奶放入奶箱");
        state = true;
        notifyAll();
    }

    public synchronized void get() {
        if (!state) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("用户拿到第" + this.milk + "瓶奶");
        state = false;
         notifyAll();
    }
public class Customer implements Runnable {
    private Box b;

    public Customer(Box b) {
        this.b = b;
    }

    @Override
    public void run() {
        while (true) {
            b.get();
        }
    }
}


public class Producer implements Runnable {
    private Box b;

    public Producer(Box b) {
        this.b = b;
    }


    @Override
    public void run() {
        for (int i = 1; i <= 5; i++) {
            b.put(i);
        }
    }
}

运行结果及与Debug 结果不同

img

我想要达到的结果

Debug 的结果才是我想要的结果 找了半天没找到原因
求解答

应该是多线程没有处理好导致的,一半debug和release除了优化参数不一样外,都是一样的,因为debug加入了许多调试符号,所以执行可能会慢一点,结果正常,
release执行的快些,所以结果就不对了,一般都是多线程导致的

因为锁对象为Box,调用notifyAll可能把put方法等待的线程唤醒了,导致put执行两次