java會為每個object對象分配一個monitor,當某個對象的同步方法(synchronized methods )被多個線程調用時,該對象的monitor將負責處理這些訪問的並發獨占要求。
當一個線程調用一個對象的同步方法時,JVM會檢查該對象的monitor。如果monitor沒有被占用,那么這個線程就得到了monitor的占有權,可以繼續執行該對象的同步方法;如果monitor被其他線程所占用,那么該線程將被掛起,直到monitor被釋放。
當線程退出同步方法調用時,該線程會釋放monitor,這將允許其他等待的線程獲得monitor以使對同步方法的調用執行下去。
注意:Java對象的monitor機制和傳統的臨界檢查代碼區技術不一樣。java的一個同步方法並不意味着同時只有一個線程獨占執行,但臨界檢查代碼區技術確實會保證同步方法在一個時刻只被一個線程獨占執行。Java的monitor機制的准確含義是:任何時刻,對一個指定object對象的某同步方法只能由一個線程來調用。
java對象的monitor是跟隨object實例來使用的,而不是跟隨程序代碼。兩個線程可以同時執行相同的同步方法,比如:一個類的同步方法是xMethod(),有a,b兩個對象實例,一個線程執行a.xMethod(),另一個線程執行b.xMethod(). 互不沖突。