Я работаю над несколькими вариантами использования для производителя и потребителя проблемы «производитель-потребитель» с Java.Код на github .Та же самая реализация работала для случая использования одного производителя , но велась странно для случая использования нескольких производителей.
У меня есть несколько вопросов относительно вывода:
Вначало, все производители и один потребитель имеют блокировку:
Producer t1 has lock
t5 produced 1, integerQueue: [1]
Producer t5 notifiedAll
- Я думал, что все потоки должны конкурировать за блокировку, и должен быть не более одного потока, который имеет блокировку всех времен?Все производители делят замок?Как потребительский поток t5 получил блокировку, когда производственный поток t1 удерживал ее?
После того, как он некоторое время работает, появляется еще одно странное явление:
Producer t5 has lock
t5 produced 10, integerQueue: [8, 9, 10]
Producer t5 notifiedAll
Producer t5 has lock
t5 produced 11, integerQueue: [8, 9, 10, 11]
Producer t5 notifiedAll
Consumer t8 has lock
t8 consumed 8, integerQueue: [9, 10, 11]
Consumer t8 notified All
Consumer t8 has lock
t8 consumed 9, integerQueue: [10, 11]
Consumer t8 notified All
Кажется, что все потоки, кроме одного производителя и потребителя, умерли, и эти два переключают блокировку между собой.Почему это происходит?Что случилось со всеми другими производителями и потребителями?
Любая помощь очень ценится.