一. 兩者的共同點
- 都是用來協調多線程對共享對象、變量的訪問
- 都是可重入鎖,同一線程可以多次獲得同一個鎖
- 都保證了可見性和互斥性
二. 兩者的不同點
- ReentrantLock顯示的獲得、釋放鎖,synchronized隱式獲得釋放鎖
- ReentrantLock 可響應中斷、可輪回,synchronized是不可以響應中斷的,為處理鎖的不可用性提供了更高的靈活性
- ReentrantLock是API級別的,synchronized是JVM級別的
- ReentrantLock可以實現公平鎖
- ReentrantLock通過Condition可以綁定多個條件
- 底層實現不一樣, synchronized是同步阻塞,使用的是悲觀并發策略,lock是同步非阻塞,采用的是樂觀并發策略
- Lock是一個接口,而synchronized是Java中的關鍵字,synchronized是內置的語言實現。
- synchronized在發生異常時,會自動釋放線程占有的鎖,因此不會導致死鎖現象發生;
而Lock在發生異常時,如果沒有主動通過unLock()去釋放鎖,則很可能造成死鎖現象,因此使用 Lock 時需要在finally塊中釋放鎖。
- Lock可以讓等待鎖的線程響應中斷,而synchronized卻不行,使用synchronized時,等待的線程會一直等待下去,不能夠響應中斷。
- 通過Lock可以知道有沒有成功獲取鎖,而synchronized卻無法辦到。
- Lock可以提高多個線程進行讀操作的效率,既就是實現讀寫鎖等。