1. 程式人生 > >Java併發之Lock第一季(含synchronized對比)

Java併發之Lock第一季(含synchronized對比)

1、簡單回顧一下synchronized

a、一個Java中的關鍵字

b、一個普通程式碼塊被synchronized修飾,那麼鎖就是當前物件,當一個執行緒物件A獲得了物件鎖,並執行該程式碼塊時,其他的執行緒物件B或其他名字,便會一直等待,一直等待執行緒A釋放鎖

c、執行緒A在什麼情況下會釋放鎖?

c-1、執行緒A執行完了該程式碼塊,哥用完了,此時會釋放掉物件鎖(當前物件)

c-2、執行緒A在執行程式碼塊過程中,丟擲了異常,此時JVM會讓執行緒A釋放掉鎖

c-3、有個wait()方法,執行緒A在執行程式碼塊時,碰見了wait()方法,就在原地等待,然後立刻釋放掉鎖,一直等著有人喚醒它。。尷尬

 

d、現在出現一個問題,拿到鎖的執行緒A,由於各種原因被阻塞了,例如等待IO,呼叫sleep()方法,然後又沒有釋放鎖

 

e、其他執行緒兄弟們只能一直等待執行緒A釋放鎖,一直等它,艹,等到猴年

 

f、這出現了一個需求,就是無論執行緒A執行成什麼屌絲樣,還是遇到什麼,我要求它必須要釋放掉鎖,不能影響其他執行緒,而且我想知道到底在哪釋放掉鎖,synchronized就是你不知道它在哪上的鎖,不知道它真正在哪釋放的鎖,你也控制不了

 

g、這就引出了Lock,Lock能看見在哪上的鎖,還能顯式的看見在哪釋放掉鎖,這又是一次隱式與顯式的妙用,Lock更方便的管理鎖機制,感覺大牛覺得自己挖了坑,自己要來填一樣

 

2、Lock是一個類、牛13的類,而synchronized是關鍵字

 

3、Lock可以知道知道執行緒物件有沒有獲得鎖,這是synchronized不具備的能力

 

4、Lock通過程式碼實現鎖,所以你要保證會釋放掉鎖,比如發生異常,你要在finally{}中顯式的呼叫unLock()方法,釋放鎖

 

5、synchronized是在JVM層面上實現的,在程式碼出現異常時,JVM會自動釋放掉鎖,而且監控工具可以監控synchronized的鎖定

 

6、在資源競爭很一般的情況下,synchronized的效能優於ReenTrantLock(Lock的擴充套件類)

 

7、如果執行緒對於資源的競爭很激烈,synchronized的效能會很爛,遠遠不如ReenTrantLock(中文名字:重入鎖)