天天看點

關于Java鎖的面試總結

    面試過程中,也被問過幾次關于Java中鎖的問題,面試官一般是這麼問:你了解Java中的鎖嗎?有幾種?都有什麼差別?講一講。

    大緻可以分為這幾點:鎖是什麼,有什麼用,有哪幾種鎖,鎖的差別。

一:鎖是什麼,有什麼用?

  鎖主要用來實作資源共享的同步。隻有擷取到了鎖才能通路該同步代碼,否則等待其他線程使用結束釋放鎖。

二:有哪幾種鎖?

  這裡主要針對:synchronize和Lock(因為面試就是問這兩個)。

  synchronize: 可以放在方法前面;也可以放在代碼塊前面,但需要指定上鎖的對象。通常和wait,notify,notifyAll一塊使用。wait:釋放占有的對象鎖,釋放CPU。  sleep:則是釋放CPU,但是不釋放占有的對象鎖。

notify:喚醒等待隊列中的一個線程,使其獲得鎖進行通路。

notifyAll:喚醒等待隊列中等待該對象鎖的全部線程,讓其競争去獲得鎖。

  Lock:擁有synchronize相同的語義,但是添加一些其他特性,如中斷鎖等候和定時鎖等候,是以可以使用lock代替synchronize。提供的方法有:

  lock():以阻塞式擷取鎖,沒有擷取到一直等待,不會被中斷。

  tryLock(): 擷取一下,擷取到就傳回true,沒擷取到就傳回false。

  tryLock(long timeout,TimeUnit unit):擷取到傳回true,沒擷取到等待給定的時間,還沒擷取到就傳回false。

  lockInterruptibly() : 與lock類似,但是沒有擷取鎖會進入到休眠狀态,直到獲得鎖或者目前線程被别的線程中斷。

三:兩者的差別?

  性能不一緻:資源競争激勵的情況下,lock性能會比synchronize好,競争不激勵的情況下,synchronize比lock性能好。

  鎖機制不一樣:synchronize是在JVM層面實作的,系統會監控鎖的釋放與否。lock是代碼實作的,需要手動釋放,在finally塊中釋放。可以采用非阻塞的方式擷取鎖。

  用法不一樣:synchronize可以用在代碼塊上,方法上。lock通過代碼實作,有更精确的線程語義。

繼續閱讀