回顧前面:
只有光頭才能變強!那麼接下來我們就開始吧~
來總結一下要點吧:
class x finally }}
首先我們可以看到有三個內部類:
這些內部類都是aqs的子類,這就印證了我們之前所說的:aqs是reentrantlock的基礎,aqs是構建鎖、同步器的框架
嘗試獲取鎖,獲取失敗的話就呼叫aqs的acquire(1)
方法
acquire(1)
方法我們在aqs時簡單看過,其中tryacquire()
是子類來實現的
我們去看看tryacquire()
:
公平的lock方法其實就多了乙個狀態條件:
這個方法主要是判斷當前執行緒是否位於clh同步佇列中的第乙個。如果是則返回flase,否則返回true。
unlock方法也是在aqs中定義的:
去看看tryrelease(arg)
是怎麼實現的:
我們知道synchronized內建鎖和reentrantlock都是互斥鎖(一次只能有乙個執行緒進入到臨界區(被鎖定的區域))
而reentrantreadwritelock是乙個讀寫鎖:
一般來說:我們大多數都是讀取資料得多,修改資料得少。所以這個讀寫鎖在這種場景下就很有用了!
讀寫鎖有乙個介面readwritelock,定義的方法就兩個:
我們還是來看看頂部注釋說得啥吧:
其實大概也是說明了:在讀的時候可以共享,在寫的時候是互斥的
接下來我們還是來看看對應的實現類吧:
按照慣例也簡單看看它的頂部注釋:
於是我們可以總結出讀寫鎖的一些要點了:
reentrantreadwritelock比reentrantlock鎖多了兩個內部類(都是lock實現)來維護讀鎖和寫鎖,但是主體還是使用syn:
在reentrantlock鎖上使用的是state來表示同步狀態(也可以表示重入的次數),而在reentrantreadwritelock是這樣代表讀寫狀態的:
主要還是呼叫syn的acquire(1)
:
進去看看實現:
寫鎖的獲取呼叫的是acquireshared(int arg)
方法:
內部呼叫的是:doacquireshared(arg);
方法(實現也是在syn的),我們來看看:
總的來說看多執行緒原始碼難度係數還是好高啊,我目前的水平只能過一過了....
多執行緒後面還有挺多高深的知識點:future、同步容器啊、阻塞佇列、各種原子類啊等等等,這裡我打算就先放一放了,目前的水平有限啊~~~~~
後面可能會有一篇執行緒池的博文,敬請期待咯~
有興趣的同學可繼續往下面的參考資料下學習~~~
Lock鎖子類了解一下
回顧前面 只有光頭才能變強!那麼接下來我們就開始吧 來總結一下要點吧 class x finally 首先我們可以看到有三個內部類 這些內部類都是aqs的子類,這就印證了我們之前所說的 aqs是reentrantlock的基礎,aqs是構建鎖 同步器的框架 嘗試獲取鎖,獲取失敗的話就呼叫aqs的ac...
Lock鎖子類了解一下
回顧前面 只有光頭才能變強!那麼接下來我們就開始吧 來總結一下要點吧 class x finally 首先我們可以看到有三個內部類 這些內部類都是aqs的子類,這就印證了我們之前所說的 aqs是reentrantlock的基礎,aqs是構建鎖 同步器的框架 嘗試獲取鎖,獲取失敗的話就呼叫aqs的ac...
Lock鎖子類了解一下
回顧前面 只有光頭才能變強!那麼接下來我們就開始吧 來總結一下要點吧 class x finally 首先我們可以看到有三個內部類 這些內部類都是aqs的子類,這就印證了我們之前所說的 aqs是reentrantlock的基礎,aqs是構建鎖 同步器的框架 嘗試獲取鎖,獲取失敗的話就呼叫aqs的ac...