Monitor是一個同步工具,相當於操作系統中的互斥量(mutex),即值為1的信號量。
它內置與每一個object對象中,相當於一個許可證。拿到許可證既可以進行操作,沒有難道則需要阻塞等待。
synchronized 實現原理
synchronized 又叫做內置鎖,為什么呢?因為使用synchronized加鎖的同步代碼塊在字節碼引擎中執行時,其實是通過鎖對象的monitor的取用與釋放來實現的。由上面我們知道Monitor是內置於任何一個對象中,synchronized利用monitor來實現加鎖解鎖的, 故synchronized又被稱作內置鎖。
1、現在我們知道為什么用synchronized(lock)來加鎖的時候,鎖對象可以是任意對象了
2、一個對象的monitor是唯一的,相當於一個唯一的許可證。拿到許可證的線程才可以執行,執行完釋放對象的monitor才可以被其他線程獲取。
我們來講解一下syncrhoized加鎖的同步塊的執行過程:
現在假設有代碼塊:
syncrhoized(Object lock){
同步代碼...;
}
它在字節碼文件中被編譯為:monitorenter;//獲取monitor許可證,進入同步塊
同步代碼...
monitorexit;//離開同步塊后,釋放monitor許可證