Monitor là high-level synchronization construct: object chứa mutex (đảm bảo mutual exclusion) + condition variables (cho phép threads wait/notify). Producer-Consumer problem: producer thêm item vào bounded buffer, consumer lấy ra; khi buffer đầy producer phải chờ; khi buffer rỗng consumer phải chờ. Implement với Java (built-in monitor):
java
synchronized void produce(Item item) {
while (buffer.isFull()) wait(); // release lock, wait
buffer.add(item);
notifyAll(); // wake up waiting consumers
}
synchronized Item consume() {
while (buffer.isEmpty()) wait();
Item item = buffer.remove();
notifyAll(); // wake up waiting producers
return item;
}Go implementation thường dùng channel:
go
ch := make(chan Item, bufferSize)
// Producer
ch <- item
// Consumer
item := <-chGo channel built-in implement producer-consumer pattern với blocking semantics. Semaphore approach: dùng counting semaphore empty (=N) và full (=0) + mutex — classic Dijkstra solution. Java BlockingQueue: production-ready implementation.