摘要:前言回顧前面多線程三分鐘就可以入個門了源碼剖析多線程基礎必要知識點看了學習多線程事半功倍鎖機制了解一下簡簡單單過一遍只有光頭才能變強上一篇已經將鎖的基礎簡單地過了一遍了,因此本篇主要是講解鎖主要的兩個子類那么接下來我們就開始吧一鎖首先我們來
前言
回顧前面:
多線程三分鐘就可以入個門了!
Thread源碼剖析
多線程基礎必要知識點!看了學習多線程事半功倍
Java鎖機制了解一下
AQS簡簡單單過一遍
只有光頭才能變強!
上一篇已經將Lock鎖的基礎AQS簡單地過了一遍了,因此本篇主要是講解Lock鎖主要的兩個子類:
ReentrantLock
ReentrantReadWriteLock
那么接下來我們就開始吧~
一、ReentrantLock鎖首先我們來看看ReentrantLock鎖的頂部注釋,來看看他的相關特性唄:
來總結一下要點吧:
比synchronized更有伸縮性(靈活)
支持公平鎖(是相對公平的)
使用時最標準用法是在try之前調用lock方法,在finally代碼塊釋放鎖
class X { private final ReentrantLock lock = new ReentrantLock(); // ... public void m() { lock.lock(); // block until condition holds try { // ... method body } finally { lock.unlock() } } }1.1內部類
首先我們可以看到有三個內部類:
這些內部類都是AQS的子類,這就印證了我們之前所說的:AQS是ReentrantLock的基礎,AQS是構建鎖、同步器的框架
可以很清晰的看到,我們的ReentrantLock鎖是支持公平鎖和非公平鎖的~
1.2構造方法 1.3非公平lock方法嘗試獲取鎖,獲取失敗的話就調用AQS的acquire(1)方法
acquire(1)方法我們在AQS時簡單看過,其中tryAcquire()是子類來實現的
我們去看看tryAcquire():
1.4公平lock方法公平的lock方法其實就多了一個狀態條件:
這個方法主要是判斷當前線程是否位于CLH同步隊列中的第一個。如果是則返回flase,否則返回true。
1.5unlock方法unlock方法也是在AQS中定義的:
去看看tryRelease(arg)是怎么實現的:
二、ReentrantReadWriteLock我們知道synchronized內置鎖和ReentrantLock都是互斥鎖(一次只能有一個線程進入到臨界區(被鎖定的區域))
而ReentrantReadWriteLock是一個讀寫鎖:
在讀取數據的時候,可以多個線程同時進入到到臨界區(被鎖定的區域)
在寫數據的時候,無論是讀線程還是寫線程都是互斥的
一般來說:我們大多數都是讀取數據得多,修改數據得少。所以這個讀寫鎖在這種場景下就很有用了!
讀寫鎖有一個接口ReadWriteLock,定義的方法就兩個:
我們還是來看看頂部注釋說得啥吧:
其實大概也是說明了:在讀的時候可以共享,在寫的時候是互斥的
接下來我們還是來看看對應的實現類吧:
按照慣例也簡單看看它的頂部注釋:
于是我們可以總結出讀寫鎖的一些要點了:
讀鎖不支持條件對象,寫鎖支持條件對象
讀鎖不能升級為寫鎖,寫鎖可以降級為讀鎖
讀寫鎖也有公平和非公平模式
讀鎖支持多個讀線程進入臨界區,寫鎖是互斥的
2.1ReentrantReadWriteLock內部類ReentrantReadWriteLock比ReentrantLock鎖多了兩個內部類(都是Lock實現)來維護讀鎖和寫鎖,但是主體還是使用Syn:
WriteLock
ReadLock
2.2讀鎖和寫鎖的狀態表示在ReentrantLock鎖上使用的是state來表示同步狀態(也可以表示重入的次數),而在ReentrantReadWriteLock是這樣代表讀寫狀態的:
2.3寫鎖的獲取主要還是調用syn的acquire(1):
進去看看實現:
2.4讀鎖獲取寫鎖的獲取調用的是acquireShared(int arg)方法:
內部調用的是:doAcquireShared(arg);方法(實現也是在Syn的),我們來看看:
三、最后這里就簡單總結一下本文的內容吧:
AQS是ReentrantReadWriteLock和ReentrantLock的基礎,因為默認的實現都是在內部類Syn中,而Syn是繼承AQS的~
ReentrantReadWriteLock和ReentrantLock都支持公平和非公平模式,公平模式下會去看FIFO隊列線程是否是在隊頭,而非公平模式下是沒有的
ReentrantReadWriteLock是一個讀寫鎖,如果讀的線程比寫的線程要多很多的話,那可以考慮使用它。它使用state的變量高16位是讀鎖,低16位是寫鎖
寫鎖可以降級為讀鎖,讀鎖不能升級為寫鎖
寫鎖是互斥的,讀鎖是共享的。
總的來說看多線程源碼難度系數還是好高啊,我目前的水平只能過一過了....
多線程后面還有挺多高深的知識點:Future、同步容器啊、阻塞隊列、各種原子類啊等等等,這里我打算就先放一放了,目前的水平有限啊~
后面可能會有一篇線程池的博文,敬請期待咯~
有興趣的同學可繼續往下面的參考資料下學習~~~
參考資料:
http://cmsblogs.com/?page_id=111
如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同學,可以關注微信公眾號:Java3y。為了大家方便,剛新建了一下qq群:742919422,大家也可以去交流交流。謝謝支持了!希望能多介紹給其他有需要的朋友
文章的目錄導航:
https://zhongfucheng.bitcron.com/post/shou-ji/wen-zhang-dao-hang
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/69232.html
摘要:在多線程編程中我們會遇到很多需要使用線程同步機制去解決的并發問題,而這些同步機制就是多線程編程中影響正確性和運行效率的重中之重。這五個方法之所以能指定同步器的行為,則是因為中的其他方法就是通過對這五個方法的調用來實現的。 在多線程編程中我們會遇到很多需要使用線程同步機制去解決的并發問題,而這些同步機制就是多線程編程中影響正確性和運行效率的重中之重。這不禁讓我感到好奇,這些同步機制是如何...
摘要:我在面試題中也見過他的身影,但一直不知道是什么東西。直到當前線程被或者獲取到資源,結束。簡簡單單把過一遍明天就看顯式鎖實現咯參考資料如果文章有錯的地方歡迎指正,大家互相交流。為了大家方便,剛新建了一下群,大家也可以去交流交流。 前言 回顧前面: 多線程三分鐘就可以入個門了! Thread源碼剖析 多線程基礎必要知識點!看了學習多線程事半功倍 Java鎖機制了解一下 只有光頭才能變強...
摘要:所謂的重入,就是當本線程想再次獲得鎖,不需要重新申請,它本身就已經鎖了,即重入該鎖。如果不為,則表示有線程已經占有了??偨Y回顧下要點是一個可重入的鎖被當前占用的線程重入。 上一章《AQS源碼閱讀》講了AQS框架,這次講講它的應用類(注意不是子類實現,待會細講)。ReentrantLock,顧名思義重入鎖,但什么是重入,這個鎖到底是怎樣的,我們來看看類的注解說明showImg(http:...
摘要:不同的是它還多了內部類和內部類,以及讀寫對應的成員變量和方法。另外是給和內部類使用的。內部類前面說到的操作是分配到里面執行的。他們都是接口的實現,所以其實最像應該是這個兩個內部類。而且大體上也沒什么差異,也是用的內部類。 之前講了《AQS源碼閱讀》和《ReentrantLock源碼閱讀》,本次將延續閱讀下ReentrantReadWriteLock,建議沒看過之前兩篇文章的,先大概了解...
摘要:之所以使用這種方式是因為在恢復一個被掛起的線程與該線程真正運行之間存在著嚴重的延遲。這樣我們就可以把線程恢復運行的這段時間給利用起來了,結果就是線程更早的獲取了鎖,線程獲取鎖的時刻也沒有推遲。 前言 系列文章目錄 上一篇 我們學習了lock接口,本篇我們就以ReentrantLock為例,學習一下Lock鎖的基本的實現。我們先來看看Lock接口中的方法與ReentrantLock對其實...
閱讀 838·2021-09-22 15:18
閱讀 1191·2021-09-09 09:33
閱讀 2762·2019-08-30 10:56
閱讀 1197·2019-08-29 16:30
閱讀 1495·2019-08-29 13:02
閱讀 1465·2019-08-26 13:55
閱讀 1650·2019-08-26 13:41
閱讀 1948·2019-08-26 11:56