Up until now, discussion has been about communication using shared data.
Messages provide for communication without shared data.
One process or the other owns the data, never two at the same time. If the mailbox is full, wait until there is enough space in the mailbox. If the mailbox is empty, then wait until a message is placed in it. Note that buffer recycling is implicit, whereas it was explicit in the semaphore implementation. Note that this is hardwired in this example.