【面試題】synchronized和Lock鎖的區別
阿新 • • 發佈:2021-07-18
synchronized和Lock鎖的區別
讀後有收穫,小禮物走一走,請作者喝咖啡。
-
synchronized是java內建關鍵字,是在JVM層面實現的;Lock是java的一個介面,是通過程式碼實現的,為具體的java類(java.util.concurrent.locks.Lock),屬於API層面的鎖;
-
synchronized無法判斷是否獲取鎖的狀態,Lock可以判斷是否獲取到鎖;
-
synchronized會自動釋放鎖(a 執行緒執行完同步程式碼會釋放鎖;b 執行緒執行過程中發生異常會釋放鎖),Lock需在finally中手工釋放鎖(unlock()方法釋放鎖);否則,容易造成執行緒死鎖;
-
用synchronized關鍵字修飾的兩個執行緒1和執行緒2,假設執行緒1獲得鎖,執行緒2等待。如果執行緒1阻塞,執行緒2則會一直等待下去,而Lock鎖就不一定會等待下去,如果嘗試獲取不到鎖,執行緒可以不用一直等待就結束了;
-
synchronized的鎖可重入、不可中斷、非公平,而Lock鎖可重入、可中斷、可公平;
-
Lock鎖的範圍是塊,而synchronized可以鎖住塊、物件、類;
-
Lock鎖適合大量程式碼同步的問題,synchronized鎖適合少量程式碼的同步問題。
Lock介面如下:
public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock(); boolean tryLock(long time, TimeUnit unit) throws InterruptedException; void unlock(); Condition newCondition(); }
讀後有收穫,小禮物走一走,請作者喝咖啡。
讚賞支援