天天看點

Java同步機制之Monitor螢幕與syncrhoized實作原理

一:Monitor

      Monitor是一個同步工具,相當于作業系統中的互斥量(mutex),即值為1的信号量。

      它内置與每一個Object對象中,相當于一個許可證。拿到許可證即可以進行操作,沒有拿到則需要阻塞等待。

    二:syncrhoized實作原理

       syncrhoized又叫做内置鎖,為什麼呢?因為使用syncrhoized加鎖的同步代碼塊在位元組碼引擎中執行時,其實是通過鎖對象的monitor的取用與釋放來實作的。由上面我們直到Monitor是内置于任何一個對象中的,syncrhoized利用monitor來實作加鎖解鎖,故syncrhoized又叫做内置鎖。

       現在我們知道為什麼用syncrhoized(lock)來加鎖時,鎖對象可以是任意對象了:

       1:syncrhoized(lock)加鎖時,用到的其實隻是lock對象内置的monitor而已;

       2:一個對象的monitor是唯一的,相當于一個唯一的許可證。拿到許可證的線程才可以執行,執行完後釋放對象的monitor才可以被其他線程擷取。

       我們來講解一下syncrhoized加鎖的同步塊的執行過程:

       現在假設有代碼塊:  syncrhoized(Object lock){

                                                                         同步代碼...;

                                    }

        它在位元組碼檔案中被編譯為:monitorenter;//擷取monitor許可證,進入同步塊

                                             同步代碼...

                                             monitorexit;//離開同步塊後,釋放monitor許可證