Да, мьютекс / монитор связан с экземпляром Java Object
, который в этом случае является общим списком. Это означает, что все потоки блокируют один и тот же мьютекс (связанный с queue
и синхронизируются через него.
Итак, хорошая часть: ваша программа на самом деле поточно-ориентирована.
Однако дополнительный семафор на самом деле не имеет большого смысла во многих отношениях:
- Проверки (например, для availablePermits) происходят за пределами блокировки и, следовательно, являются лишь лучшим предположением о состоянии вашей очереди. Вскоре после этого все может измениться.
- Попытка получить семафор внутри замка, который может быть освобожден только внутри того же замка, выглядит как гарантированный рецепт тупика.
Как уже упоминал AnDus, это, возможно, лучше решить с помощью методов wait и notify, которые действуют как условные переменные. Скорее всего, вам понадобится даже два, один для разблокировки производителей и один для разблокирования потребителей.
В общем, если это не упражнение по кодированию, используйте класс, который уже реализует желаемую функциональность. В этом случае java.util.concurrent.BlockingQueue
выглядит как то, что вы хотите.