最通俗易懂的synchronized原理解析

之前有文章寫過synchronized的作用,這裏不多說了,直接開始講原理。

synchronized是Java的內置鎖,是重量級鎖,也是可重入鎖。性能上不如Lock這種顯示鎖,而且缺乏許多功能,但是其優點是使用便捷。

首先看一段代碼及其字節碼:

public class SynchronizedTest {
    
    public synchronized void fun1(){

    }

    public void fun2(){
        synchronized (this){

        }
    }
}

(一)可以看到當synchronized修飾代碼塊時,會先執行monitorenter,退出時會執行monitorexit。

這裏就要說到Java的內置監視器Monitor了,每個對象都有一個內置監視器Monitor,內部有一個計數器。

1、若計數器的值爲0,則說明沒有線程進入,當前線程可以成爲Monitor的持有者,進入代碼塊,計數器+1。

2、若當前線程持有該Monitor,且計數器不爲零,則可重入,計數器加一。

3、當前線程執行完該代碼塊,執行monitorexit語句,計數器減一。

4、若線程既沒有持有monitor,計數器值也不爲零,則進入阻塞狀態,等待其他線程釋放鎖。

(二)synchronized修飾方法時,並沒有顯示的寫出moniter的操作,而是在該Class文件的方法表中將該方法的access_flags字段中的synchronized的標誌位置爲1,表示該方法是同步對象,並且使用該方法的對象(非static方法)或使用該方法的對象所屬的Class在JVM內部的對象 作爲鎖對象。


發佈了206 篇原創文章 · 獲贊 259 · 訪問量 59萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章