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