Watcher:

Watcher keeps track of the current position of the buffer. It also contains the order that the threads receive the buffer. This allows the buffer to go through the threads in the correct order.

Watcher has methods that the threads call when they want to use the buffer and when they are done with the buffer.

If the buffer is currently in use by another thread, the thread that wants access it will be waiting until another thread is done with the buffer.