Java多線程之多種鎖和阻塞隊列
一、悲觀鎖和樂觀鎖
1.1. 樂觀鎖
顧名思義,就是很樂觀,每次去拿數(shù)據(jù)的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數(shù)據(jù),可以使用版本號等機制。
樂觀鎖適用于多讀的應用類型,樂觀鎖在Java中是通過使用無鎖編程來實現(xiàn),最常采用的是CAS算法,Java原子類中的遞增操作就通過CAS自旋實現(xiàn)的。
CAS全稱 Compare And Swap(比較與交換),是一種無鎖算法。在不使用鎖(沒有線程被阻塞)的情況下實現(xiàn)多線程之間的變量同步。java.util.concurrent包中的原子類就是通過CAS來實現(xiàn)了樂觀鎖。
1.2. 悲觀鎖
總是假設最壞的情況,每次去拿數(shù)據(jù)的時候都認為別人會修改,所以每次在拿數(shù)據(jù)的時候都會上鎖,這樣別人想拿這個數(shù)據(jù)就會阻塞直到它拿到鎖。
二、公平鎖和非公平鎖


三、可重入鎖(遞歸鎖)
先看官網(wǎng)的解釋翻譯后的

看不太懂,那么我們結合一下下面的案例就行了。

兩個同步方法01和02,都是被鎖住的,當我們運行01的時候,一旦獲取的01的鎖,那么02的鎖也可以被自動獲取。

補充:lock和unlock只要配對使用,就不會有問題。
四、自旋鎖

其實CAS底層就是用 Unsafe類+CAS(自旋) 實現(xiàn)的,CAS底層有一個do while語句,循環(huán)比較在主存中的值是否等于期望值。
五、獨占鎖(寫)/共享鎖(讀)

讀歸讀,寫歸寫,讀和寫可以同時進行。
六、什么是阻塞隊列?
隊列中放著數(shù)據(jù),一個線程生產(chǎn),一個線程獲取。


七、阻塞隊列(BlockingQueue)

阻塞隊列有多少實現(xiàn)類呢?

到此這篇關于Java多線程之多種鎖和阻塞隊列的文章就介紹到這了,更多相關java多種鎖和阻塞隊列內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot如何統(tǒng)一處理返回結果和異常情況
這篇文章主要介紹了SpringBoot如何統(tǒng)一處理返回結果和異常情況問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
Java中Lambda表達式和函數(shù)式接口的使用和特性
Java Lambda表達式是一種函數(shù)式編程的特性,可簡化匿名內部類的寫法,與函數(shù)式接口搭配使用,實現(xiàn)代碼簡潔、可讀性高、易于維護的特點,適用于集合操作、多線程編程等場景2023-04-04
JpaRepository如何實現(xiàn)增刪改查并進行單元測試
這篇文章主要介紹了JpaRepository如何實現(xiàn)增刪改查并進行單元測試,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
MyBatis-Plus攔截器實現(xiàn)數(shù)據(jù)權限控制的示例
本文主要介紹了MyBatis-Plus攔截器實現(xiàn)數(shù)據(jù)權限控制的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-02-02
Spring中配置Transaction與不配置的區(qū)別及說明
這篇文章主要介紹了Spring中配置Transaction與不配置的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07

