-Monitors are a higher level synch primitive that takes the form of a data type, in which the compiler defines mutual exclusion. When a thread calls a monitor which is already used, it is queued and sleeps until the monitor is free again – very much like a semaphore, but needs to be defined beforehand as part of the OS. A condition variable is a wait() and signal() primitive for monitor functions