Synchronized 和 Lock 鎖簡述

Ø 首先我們從源碼瞭解兩個鎖的特徵

synchronized的實現是對象有一個monitor監視器,多個線程線程執行指令獲取監視器的狀態,如果成功獲取則對monitor+1,其他線程在隊列中阻塞(線程掛起),獲取的鎖的線程如果一直沒有釋放,是可以不斷重入的,退出則monitor-1,知道monitor=0,表示鎖被釋放,其他線程進行爭搶,因此synchronized是非公平鎖(爭搶),可重入鎖;

Lock:Lock鎖通過Volatile關鍵字保證一個state的可見性,之後通過CAS(和樂觀鎖相似)來判斷當前線程釋放獲得鎖,如果沒有則重試一次之後進入雙向鏈表尾部進行自選(非掛起),直到當前線程為鏈表頭結點重新嘗試獲取鎖;因此Lock是不能重入鎖,並且是公平鎖;

Ø 概念上了解:

synchronized是Java中的一個關鍵字,Lock是JVM層面的一個類

synchronized當作用的代碼塊拋出異常會自動釋放鎖,因此可以避免出現死鎖情況;當Lock出現異常,需要unlock去釋放鎖,因此Lock鎖是可以隨時中斷的鎖;

synchronized的作用域可以是類、方法、代碼塊,Lock只用於代碼塊;

synchronized關鍵字的兩個線程1和線程2,如果當前線程1獲得鎖,線程2線程等待。如果線程1阻塞,線程2則會一直等待下去,而Lock鎖就不一定會等待下去,如果嘗試獲取不到鎖,線程可以不用一直等待就結束了

結尾:

Lock的性能好於synchronized,Lock屬於輕量級鎖,這也和Lock自旋鎖關係很大,因為不會掛起線程,減少CPU切換;


分享到:


相關文章: