Java基礎篇--synchronized 和 ReentrantLock 的實現原理是什麼?它們有什麼區別?

在 JDK 1.5 之前共享對象的協調機制只有 synchronized 和 volatile,在 JDK 1.5 中增加了新的機制 ReentrantLock,該機制的誕生並不是爲了替代 synchronized,而是在 synchronized 不適用的情況下,提供一種可以選擇的高級功能。

我們本課時的面試題是,synchronized 和 ReentrantLock 是如何實現的?它們有什麼區別?

典型回答

synchronized 屬於獨佔式悲觀鎖,是通過 JVM 隱式實現的,synchronized 只允許同一時刻只有一個線程操作資源。

在 Java 中每個對象都隱式包含一個 monitor(監視器)對象,加鎖的過程其實就是競爭 monitor 的過程,當線程進入字節碼 monitorenter 指令之後,線程將持有 monitor 對象,執行 monitorexit 時釋放 monitor 對象,當其他線程沒有拿到 monitor 對象時,則需要阻塞等待獲取該對象。

ReentrantLock 是 Lock 的默認實現方式之一,它是基於 AQS(Abstract Queued Synchronizer,隊列同步器)實現的,它默認是通過非公平鎖實現的,在它的內部有一個 state 的狀態字段用於表示鎖是否被佔用,如果是 0 則表示鎖未被佔用,此時線程就可以把 state 改爲 1,併成功獲得鎖,而其他未獲得鎖的線程只能去排隊等待獲取鎖資源。

synchronized 和 ReentrantLock 都提供了鎖的功能,具備互斥性和不可見性。在 JDK 1.5 中 synchronized 的性能遠遠低於  ReentrantLock,但在 JDK 1.6 之後  synchronized 的性能略低於  ReentrantLock,它的區別如下:

    synchronized 是 JVM 隱式實現的,而 ReentrantLock 是 Java 語言提供的 API;
    ReentrantLock 可設置爲公平鎖,而 synchronized 卻不行;
    Reentr

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章