【面試普通人VS高手系列】lock和synchronized區別

今天來分享一道阿里一面的面試題,「lock和synchronized的區別」。

對於這個問題,看看普通人和高手的回答!

普通人:

嗯,lock是J.U.C包裡面提供的鎖,synchronized是Java中的同步關鍵字。

他們都可以實現多執行緒對共享資源訪問的執行緒安全性。

高手:

下面我從4個方面來回答

  1. 從功能角度來看,Lock和Synchronized都是Java中用來解決執行緒安全問題的工具。

  2. 從特性來看

    1. Synchronized是Java中的同步關鍵字,Lock是J.U.C包中提供的介面,這個介面有很多實現類,其中就包括ReentrantLock重入鎖

    2. Synchronized可以通過兩種方式來控制鎖的粒度

      img

      點擊並拖拽以移動

      一種是把synchronized關鍵字修飾在方法層面

      另一種是修飾在程式碼塊上,並且我們可以通過Synchronized加鎖對象的聲明周期來控制鎖的作用範圍,比如鎖對象是靜態對象或者類對象,那麼這個鎖就是全局鎖。

      如果鎖對象是普通實例對象,那這個鎖的範圍取決於這個實例的聲明周期。

      Lock鎖的粒度是通過它裡面提供的lock()unlock()方法決定的

      img

      點擊並拖拽以移動

      包裹在這兩個方法之間的程式碼能夠保證執行緒安全性。而鎖的作用域取決於Lock實例的生命周期。

    3. Lock比Synchronized的靈活性更高,Lock可以自主決定什麼時候加鎖,什麼時候釋放鎖,只需要調用lock()unlock()這兩個方法就行,同時Lock還提供了非阻塞的競爭鎖方法tryLock()方法,這個方法通過返回true/false來告訴當前執行緒是否已經有其他執行緒正在使用鎖。

      Synchronized由於是關鍵字,所以它無法實現非阻塞競爭鎖的方法,另外,Synchronized鎖的釋放是被動的,就是當Synchronized同步程式碼塊執行完以後或者程式碼出現異常時才會釋放。

    4. Lock提供了公平鎖和非公平鎖的機制,公平鎖是指執行緒競爭鎖資源時,如果已經有其他執行緒正在排隊等待鎖釋放,那麼當前競爭鎖資源的執行緒無法插隊。而非公平鎖,就是不管是否有執行緒在排隊等待鎖,它都會嘗試去競爭一次鎖。 Synchronized只提供了一種非公平鎖的實現。

  3. 從性能方面來看,Synchronized和Lock在性能方面相差不大,在實現上會有一些區別,Synchronized引入了偏向鎖、輕量級鎖、重量級鎖以及鎖升級的方式來優化加鎖的性能,而Lock中則用到了自旋鎖的方式來實現性能優化。

以上就是我對於這個問題的理解。

總結

這個問題主要是考察求職責對並發基礎能力的掌握。

在實際應用中,執行緒以及執行緒安全性是非常重要和常見的功能,對於這部分內容如果理解不夠深刻,很容易造成生產級別的故障。

如果在面試過程中遇到了比較刁鑽和奇葩的問題,歡迎私信或評論區給我留言!

我是Mic,一個工作了14年的Java程式設計師,咱們下篇文章再見。