Lock鎖子類了解一下

2021-09-25 21:56:17 字數 1591 閱讀 1133

回顧前面:

只有光頭才能變強!

那麼接下來我們就開始吧~

來總結一下要點吧:

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...