Synchronized的實現(xiàn)原理是基于Java中的monitor機制。Java中的每個對象都有一個監(jiān)視器(monitor)與之關(guān)聯(lián),monitor是一個同步原語,用來實現(xiàn)對對象的互斥訪問。
當一個線程訪問一個被synchronized修飾的方法或代碼塊時,它會嘗試獲取對應對象的monitor。如果monitor被其他線程占用,那么當前線程就會進入阻塞狀態(tài),等待monitor被釋放。一旦monitor被釋放,當前線程將嘗試再次獲取monitor并繼續(xù)執(zhí)行。
在Java中,synchronized可以修飾方法、代碼塊和靜態(tài)方法等。對于非靜態(tài)方法,synchronized會獲取對象實例的monitor;對于靜態(tài)方法,synchronized會獲取類的monitor。這意味著對于同一個對象實例,同一時刻只能有一個線程執(zhí)行被synchronized修飾的方法;對于同一個類的不同實例,同一時刻只能有一個線程執(zhí)行被synchronized修飾的靜態(tài)方法。
使用synchronized修飾的方法或代碼塊,會在進入時自動獲取monitor,在退出時自動釋放monitor。這種自動獲取和釋放的機制確保了對共享資源的訪問是串行的,從而避免了多線程并發(fā)訪問時可能出現(xiàn)的數(shù)據(jù)競爭和不一致的問題。