国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Lock鎖子類了解一下

時(shí)飛 / 3605人閱讀

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

前言

回顧前面:

多線程三分鐘就可以入個(gè)門了!

Thread源碼剖析

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

Java鎖機(jī)制了解一下

AQS簡簡單單過一遍

只有光頭才能變強(qiáng)!

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

ReentrantLock

ReentrantReadWriteLock

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

一、ReentrantLock鎖

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

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

比synchronized更有伸縮性(靈活)

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

使用時(shí)最標(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)部類

首先我們可以看到有三個(gè)內(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)方法我們?cè)贏QS時(shí)簡單看過,其中tryAcquire()是子類來實(shí)現(xiàn)的

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

1.4公平lock方法

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

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

1.5unlock方法

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

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

二、ReentrantReadWriteLock

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

而ReentrantReadWriteLock是一個(gè)讀寫鎖

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

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

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

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

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

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

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

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

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

讀鎖不支持條件對(duì)象,寫鎖支持條件對(duì)象

讀鎖不能升級(jí)為寫鎖,寫鎖可以降級(jí)為讀鎖

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

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

2.1ReentrantReadWriteLock內(nèi)部類

ReentrantReadWriteLock比ReentrantLock鎖多了兩個(gè)內(nèi)部類(都是Lock實(shí)現(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)去看看實(shí)現(xiàn):

2.4讀鎖獲取

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

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

三、最后

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

AQS是ReentrantReadWriteLock和ReentrantLock的基礎(chǔ),因?yàn)槟J(rèn)的實(shí)現(xiàn)都是在內(nèi)部類Syn中,而Syn是繼承AQS的~

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

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

寫鎖可以降級(jí)為讀鎖,讀鎖不能升級(jí)為寫鎖

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

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

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

后面可能會(huì)有一篇線程池的博文,敬請(qǐng)期待咯~

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

參考資料:

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

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

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

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/69232.html

相關(guān)文章

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

    摘要:在多線程編程中我們會(huì)遇到很多需要使用線程同步機(jī)制去解決的并發(fā)問題,而這些同步機(jī)制就是多線程編程中影響正確性和運(yùn)行效率的重中之重。這五個(gè)方法之所以能指定同步器的行為,則是因?yàn)橹械钠渌椒ň褪峭ㄟ^對(duì)這五個(gè)方法的調(diào)用來實(shí)現(xiàn)的。 在多線程編程中我們會(huì)遇到很多需要使用線程同步機(jī)制去解決的并發(fā)問題,而這些同步機(jī)制就是多線程編程中影響正確性和運(yùn)行效率的重中之重。這不禁讓我感到好奇,這些同步機(jī)制是如何...

    yintaolaowanzi 評(píng)論0 收藏0
  • AQS簡簡單單過一遍

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

    EasonTyler 評(píng)論0 收藏0
  • Java多線程——重入ReentrantLock源碼閱讀

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

    sushi 評(píng)論0 收藏0
  • Java多線程—ReentrantReadWriteLock源碼閱讀

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

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

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

    susheng 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<