監視器是一種同步結構,它基於互斥鎖,允許線程同時互斥(使用鎖)和協作,
互斥
當一個線程訪問受保護的數據時,如果沒有其他線程在等待,線程獲取鎖並繼續執行。當線程完成執行時,它釋放鎖並退出監視器。
但如果此時另一個線程已經擁有監視器時,它必須在entry-set中等待。當前面的線程執行完畢退出監視器時,新到達的線程必須與在入口集中等待的其他線程競爭。只有一個線程能贏得競爭並擁有鎖。
協作
當一個線程需要數據在某一個狀態下它才能執行,那么另一個線程負責將數據改變到此狀態,
常見的如生產者/消費者的問題,當讀線程需要緩沖區處於“不空”的狀態它才可以從緩沖區中讀取任何數據,如果它發現緩沖區為空,則進入wait-set等待。待寫線程用數據填充緩沖區,再通知讀線程進行讀取。這種機制被稱為“Wait and Notify”或“Signal and Continue”
如下圖所示: