Условие в операторе while в вашем текущем случае является статическим, т. Е. Для MAX_SIZE == size
значение обеих переменных не изменяется при повторной оценке цикла while.
Когда notify
вызывается boxes
и поток производителя уведомляется, цикл while оценивается снова.Поскольку оба значения не изменились, оба будут иметь значение 5
, и когда цикл будет оценен, его значение снова будет 5
.Таким образом, условие будет 5==5
, что приведет к повторному вызову wait
.т.е. после входа в цикл while
условие всегда будет true
, что приведет к бесконечной блокировке.
Но с условием MAX_SIZE == boxes.size()
значение boxes.size()
является динамическим, и оно будетизменился, я думаю, по потребителю здесь.Допустим, потребитель удаляет один элемент из этого списка, так что boxes.size()=4
и он вызывает notify
на boxes
.Таким образом, поток производителя получает уведомление, и условие в producer
становится 5 == 4
, что приводит к тому, что условие составляет false
, и выходит из цикла.Следовательно код выполняется как ожидалось