Messages (like using regular queues, but interprocess).
This division is most noticed in Unix, except that instead of Monitors, Unix has SharedMemory, which is just a communication mechanism which requires synchronization.
JavaLanguage has monitors and nothing else. This is because Monitors are easier to use and they look a lot like classes. Besides, any of the three can be implemented using either of the other two.
And then LockFreeSynchronization was born.
Advanced LockBasedSynchronization:
RendezVous, ReadWriteLock.
See: SynchronizationStrategies