【面試普通人VS高手系列】lock和synchronized區別
- 2022 年 4 月 13 日
- 筆記
- JAVA, 並發編程, 面試, 面試普通人vs高手系列
今天來分享一道阿里一面的面試題,「lock和synchronized的區別」。
對於這個問題,看看普通人和高手的回答!
普通人:
嗯,lock是J.U.C包裡面提供的鎖,synchronized是Java中的同步關鍵字。
他們都可以實現多執行緒對共享資源訪問的執行緒安全性。
高手:
下面我從4個方面來回答
-
從功能角度來看,Lock和Synchronized都是Java中用來解決執行緒安全問題的工具。
-
從特性來看
-
Synchronized是Java中的同步關鍵字,Lock是J.U.C包中提供的介面,這個介面有很多實現類,其中就包括ReentrantLock重入鎖
-
Synchronized可以通過兩種方式來控制鎖的粒度
一種是把synchronized關鍵字修飾在方法層面
另一種是修飾在程式碼塊上,並且我們可以通過Synchronized加鎖對象的聲明周期來控制鎖的作用範圍,比如鎖對象是靜態對象或者類對象,那麼這個鎖就是全局鎖。
如果鎖對象是普通實例對象,那這個鎖的範圍取決於這個實例的聲明周期。
Lock鎖的粒度是通過它裡面提供的
lock()
和unlock()
方法決定的包裹在這兩個方法之間的程式碼能夠保證執行緒安全性。而鎖的作用域取決於Lock實例的生命周期。
-
Lock比Synchronized的靈活性更高,Lock可以自主決定什麼時候加鎖,什麼時候釋放鎖,只需要調用
lock()
和unlock()
這兩個方法就行,同時Lock還提供了非阻塞的競爭鎖方法tryLock()
方法,這個方法通過返回true/false來告訴當前執行緒是否已經有其他執行緒正在使用鎖。Synchronized由於是關鍵字,所以它無法實現非阻塞競爭鎖的方法,另外,Synchronized鎖的釋放是被動的,就是當Synchronized同步程式碼塊執行完以後或者程式碼出現異常時才會釋放。
-
Lock提供了公平鎖和非公平鎖的機制,公平鎖是指執行緒競爭鎖資源時,如果已經有其他執行緒正在排隊等待鎖釋放,那麼當前競爭鎖資源的執行緒無法插隊。而非公平鎖,就是不管是否有執行緒在排隊等待鎖,它都會嘗試去競爭一次鎖。 Synchronized只提供了一種非公平鎖的實現。
-
-
從性能方面來看,Synchronized和Lock在性能方面相差不大,在實現上會有一些區別,Synchronized引入了偏向鎖、輕量級鎖、重量級鎖以及鎖升級的方式來優化加鎖的性能,而Lock中則用到了自旋鎖的方式來實現性能優化。
以上就是我對於這個問題的理解。
總結
這個問題主要是考察求職責對並發基礎能力的掌握。
在實際應用中,執行緒以及執行緒安全性是非常重要和常見的功能,對於這部分內容如果理解不夠深刻,很容易造成生產級別的故障。
如果在面試過程中遇到了比較刁鑽和奇葩的問題,歡迎私信或評論區給我留言!
我是Mic,一個工作了14年的Java程式設計師,咱們下篇文章再見。