一、簡介
今天我們總結一下關於JUC方面的面試題:
- synchronized與Lock的區別?
如果面試遇到這個問題,小夥伴們可以參考從以下幾個方面進行回答:
區別 |
synchronized |
Lock |
是否關鍵字 |
synchronized是Java內置關鍵字 |
Lock類是一個接口 |
是否可嘗試獲取鎖 |
synchronized無法判斷是否獲取鎖的狀態 |
Lock可以判斷是否獲取到鎖 |
是否自動釋放鎖 |
synchronized會自動釋放鎖(a 線程執行完同步代碼會釋放鎖 ;b 線程執行過程中發生異常會釋放鎖) |
Lock需在finally中手工釋放鎖(unlock()方法釋放鎖),否則容易造成線程死鎖 |
是否一直阻塞 |
用synchronized關鍵字修飾的兩個線程1和線程2,如果當前線程1獲得鎖,線程2線程等待。如果線程1阻塞,線程2則會一直等待下去 |
Lock鎖就不一定會等待下去,如果嘗試獲取不到鎖,線程可以不用一直等待就結束了 |
是否可重入、中斷、公平鎖 |
synchronized的鎖可重入、不可中斷、非公平 |
Lock鎖可重入、可中斷、可公平(也可非公平) |
使用場合 |
synchronized鎖適合代碼少量的同步問題 |
Lock鎖適合大量同步的代碼的同步問題 |
總體來說,Lock鎖比synchronized更加靈活,提供了更加豐富的API進行同步操作,也可以結合Condition條件實現比較複雜的線程間同步通信。