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(中文名字:重入鎖)