今天來分享一道阿里一面的面試題,“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程式設計師,我們們下篇文章再見。