Ø 首先我們從源碼瞭解兩個鎖的特徵
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切換;
閱讀更多 Gmy傻瓜珍藏版 的文章