Define the interface for a bounded buffer, containing the methods put() and take() for inserting/extracting elements.
Develop an implementation of a bounded buffer that makes use of explicit locks and condition variables.
Develop a driver program that, spawning producer and consumer threads, show the behavior of the bounded buffer.
Develop an implementation of a bounded buffer that makes use of Semaphores.
Develop an implementation of a bounded buffer that exploits an instance of a BlockingQueue.