One of the standard problems of process synchronization. Two processes try to cooperate (maybe within a pipe): The first is producing results and stores them in a buffer; the second reads data from this buffer and 'consumes' it. The problem is to stop each process in time before it can produce a
buffer overflow or underrun. If an appropriate data structure is chosen (e.g. a circular buffer with two pointers), the problem can also used to show that in some cases shared data may be accessed by two concurrent processes without the need for mutual exclusion.
The node on monitors has an example java implementation using monitors.
(see also: dining philosophers problem)