成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Lock鎖子類了解一下

時飛 / 3628人閱讀

摘要:前言回顧前面多線程三分鐘就可以入個門了源碼剖析多線程基礎(chǔ)必要知識點看了學(xué)習(xí)多線程事半功倍鎖機制了解一下簡簡單單過一遍只有光頭才能變強上一篇已經(jīng)將鎖的基礎(chǔ)簡單地過了一遍了,因此本篇主要是講解鎖主要的兩個子類那么接下來我們就開始吧一鎖首先我們來

前言

回顧前面:

多線程三分鐘就可以入個門了!

Thread源碼剖析

多線程基礎(chǔ)必要知識點!看了學(xué)習(xí)多線程事半功倍

Java鎖機制了解一下

AQS簡簡單單過一遍

只有光頭才能變強!

上一篇已經(jīng)將Lock鎖的基礎(chǔ)AQS簡單地過了一遍了,因此本篇主要是講解Lock鎖主要的兩個子類:

ReentrantLock

ReentrantReadWriteLock

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

一、ReentrantLock鎖

首先我們來看看ReentrantLock鎖的頂部注釋,來看看他的相關(guān)特性唄:

來總結(jié)一下要點吧:

比synchronized更有伸縮性(靈活)

支持公平鎖(是相對公平的)

使用時最標(biāo)準(zhǔn)用法是在try之前調(diào)用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內(nèi)部類

首先我們可以看到有三個內(nèi)部類:

這些內(nèi)部類都是AQS的子類,這就印證了我們之前所說的:AQS是ReentrantLock的基礎(chǔ),AQS是構(gòu)建鎖、同步器的框架

可以很清晰的看到,我們的ReentrantLock鎖是支持公平鎖和非公平鎖的~

1.2構(gòu)造方法

1.3非公平lock方法

嘗試獲取鎖,獲取失敗的話就調(diào)用AQS的acquire(1)方法

acquire(1)方法我們在AQS時簡單看過,其中tryAcquire()是子類來實現(xiàn)的

我們?nèi)タ纯?b>tryAcquire():

1.4公平lock方法

公平的lock方法其實就多了一個狀態(tài)條件

這個方法主要是判斷當(dāng)前線程是否位于CLH同步隊列中的第一個。如果是則返回flase,否則返回true。

1.5unlock方法

unlock方法也是在AQS中定義的:

去看看tryRelease(arg)是怎么實現(xiàn)的:

二、ReentrantReadWriteLock

我們知道synchronized內(nèi)置鎖和ReentrantLock都是互斥鎖(一次只能有一個線程進(jìn)入到臨界區(qū)(被鎖定的區(qū)域))

而ReentrantReadWriteLock是一個讀寫鎖

取數(shù)據(jù)的時候,可以多個線程同時進(jìn)入到到臨界區(qū)(被鎖定的區(qū)域)

數(shù)據(jù)的時候,無論是讀線程還是寫線程都是互斥

一般來說:我們大多數(shù)都是讀取數(shù)據(jù)得多,修改數(shù)據(jù)得少。所以這個讀寫鎖在這種場景下就很有用了!

讀寫鎖有一個接口ReadWriteLock,定義的方法就兩個:

我們還是來看看頂部注釋說得啥吧:

其實大概也是說明了:在讀的時候可以共享,在寫的時候是互斥的

接下來我們還是來看看對應(yīng)的實現(xiàn)類吧:

按照慣例也簡單看看它的頂部注釋:

于是我們可以總結(jié)出讀寫鎖的一些要點了:

讀鎖不支持條件對象,寫鎖支持條件對象

讀鎖不能升級為寫鎖,寫鎖可以降級為讀鎖

讀寫鎖也有公平和非公平模式

讀鎖支持多個讀線程進(jìn)入臨界區(qū),寫鎖是互斥的

2.1ReentrantReadWriteLock內(nèi)部類

ReentrantReadWriteLock比ReentrantLock鎖多了兩個內(nèi)部類(都是Lock實現(xiàn))來維護(hù)讀鎖和寫鎖,但是主體還是使用Syn

WriteLock

ReadLock

2.2讀鎖和寫鎖的狀態(tài)表示

在ReentrantLock鎖上使用的是state來表示同步狀態(tài)(也可以表示重入的次數(shù)),而在ReentrantReadWriteLock是這樣代表讀寫狀態(tài)的:

2.3寫鎖的獲取

主要還是調(diào)用syn的acquire(1)

進(jìn)去看看實現(xiàn):

2.4讀鎖獲取

寫鎖的獲取調(diào)用的是acquireShared(int arg)方法:

內(nèi)部調(diào)用的是:doAcquireShared(arg);方法(實現(xiàn)也是在Syn的),我們來看看:

三、最后

這里就簡單總結(jié)一下本文的內(nèi)容吧:

AQS是ReentrantReadWriteLock和ReentrantLock的基礎(chǔ),因為默認(rèn)的實現(xiàn)都是在內(nèi)部類Syn中,而Syn是繼承AQS的~

ReentrantReadWriteLock和ReentrantLock都支持公平和非公平模式,公平模式下會去看FIFO隊列線程是否是在隊頭,而非公平模式下是沒有的

ReentrantReadWriteLock是一個讀寫鎖,如果讀的線程比寫的線程要多很多的話,那可以考慮使用它。它使用state的變量高16位是讀鎖,低16位是寫鎖

寫鎖可以降級為讀鎖,讀鎖不能升級為寫鎖

寫鎖是互斥的,讀鎖是共享的

總的來說看多線程源碼難度系數(shù)還是好高啊,我目前的水平只能過一過了....

多線程后面還有挺多高深的知識點:Future、同步容器啊、阻塞隊列、各種原子類啊等等等,這里我打算就先放一放了,目前的水平有限啊~

后面可能會有一篇線程池的博文,敬請期待咯~

有興趣的同學(xué)可繼續(xù)往下面的參考資料下學(xué)習(xí)~~~

參考資料:

http://cmsblogs.com/?page_id=111

如果文章有錯的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章,想要獲取更多的Java資源的同學(xué),可以關(guān)注微信公眾號:Java3y。為了大家方便,剛新建了一下qq群:742919422,大家也可以去交流交流。謝謝支持了!希望能多介紹給其他有需要的朋友

文章的目錄導(dǎo)航

https://zhongfucheng.bitcron.com/post/shou-ji/wen-zhang-dao-hang

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/69232.html

相關(guān)文章

  • Java同步機制的底層實現(xiàn)

    摘要:在多線程編程中我們會遇到很多需要使用線程同步機制去解決的并發(fā)問題,而這些同步機制就是多線程編程中影響正確性和運行效率的重中之重。這五個方法之所以能指定同步器的行為,則是因為中的其他方法就是通過對這五個方法的調(diào)用來實現(xiàn)的。 在多線程編程中我們會遇到很多需要使用線程同步機制去解決的并發(fā)問題,而這些同步機制就是多線程編程中影響正確性和運行效率的重中之重。這不禁讓我感到好奇,這些同步機制是如何...

    yintaolaowanzi 評論0 收藏0
  • AQS簡簡單單過一遍

    摘要:我在面試題中也見過他的身影,但一直不知道是什么東西。直到當(dāng)前線程被或者獲取到資源,結(jié)束。簡簡單單把過一遍明天就看顯式鎖實現(xiàn)咯參考資料如果文章有錯的地方歡迎指正,大家互相交流。為了大家方便,剛新建了一下群,大家也可以去交流交流。 前言 回顧前面: 多線程三分鐘就可以入個門了! Thread源碼剖析 多線程基礎(chǔ)必要知識點!看了學(xué)習(xí)多線程事半功倍 Java鎖機制了解一下 只有光頭才能變強...

    EasonTyler 評論0 收藏0
  • Java多線程——重入ReentrantLock源碼閱讀

    摘要:所謂的重入,就是當(dāng)本線程想再次獲得鎖,不需要重新申請,它本身就已經(jīng)鎖了,即重入該鎖。如果不為,則表示有線程已經(jīng)占有了??偨Y(jié)回顧下要點是一個可重入的鎖被當(dāng)前占用的線程重入。 上一章《AQS源碼閱讀》講了AQS框架,這次講講它的應(yīng)用類(注意不是子類實現(xiàn),待會細(xì)講)。ReentrantLock,顧名思義重入鎖,但什么是重入,這個鎖到底是怎樣的,我們來看看類的注解說明showImg(http:...

    sushi 評論0 收藏0
  • Java多線程—ReentrantReadWriteLock源碼閱讀

    摘要:不同的是它還多了內(nèi)部類和內(nèi)部類,以及讀寫對應(yīng)的成員變量和方法。另外是給和內(nèi)部類使用的。內(nèi)部類前面說到的操作是分配到里面執(zhí)行的。他們都是接口的實現(xiàn),所以其實最像應(yīng)該是這個兩個內(nèi)部類。而且大體上也沒什么差異,也是用的內(nèi)部類。 之前講了《AQS源碼閱讀》和《ReentrantLock源碼閱讀》,本次將延續(xù)閱讀下ReentrantReadWriteLock,建議沒看過之前兩篇文章的,先大概了解...

    Ververica 評論0 收藏0
  • 線程間的同步與通信(5)——ReentrantLock源碼分析

    摘要:之所以使用這種方式是因為在恢復(fù)一個被掛起的線程與該線程真正運行之間存在著嚴(yán)重的延遲。這樣我們就可以把線程恢復(fù)運行的這段時間給利用起來了,結(jié)果就是線程更早的獲取了鎖,線程獲取鎖的時刻也沒有推遲。 前言 系列文章目錄 上一篇 我們學(xué)習(xí)了lock接口,本篇我們就以ReentrantLock為例,學(xué)習(xí)一下Lock鎖的基本的實現(xiàn)。我們先來看看Lock接口中的方法與ReentrantLock對其實...

    susheng 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<