监视器是一种同步结构,它基于互斥锁,允许线程同时互斥(使用锁)和协作,
互斥
当一个线程访问受保护的数据时,如果没有其他线程在等待,线程获取锁并继续执行。当线程完成执行时,它释放锁并退出监视器。
但如果此时另一个线程已经拥有监视器时,它必须在entry-set中等待。当前面的线程执行完毕退出监视器时,新到达的线程必须与在入口集中等待的其他线程竞争。只有一个线程能赢得竞争并拥有锁。
协作
当一个线程需要数据在某一个状态下它才能执行,那么另一个线程负责将数据改变到此状态,
常见的如生产者/消费者的问题,当读线程需要缓冲区处于“不空”的状态它才可以从缓冲区中读取任何数据,如果它发现缓冲区为空,则进入wait-set等待。待写线程用数据填充缓冲区,再通知读线程进行读取。这种机制被称为“Wait and Notify”或“Signal and Continue”
如下图所示: