亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

AQS簡(jiǎn)簡(jiǎn)單單過一遍

EasonTyler / 1614人閱讀

摘要:我在面試題中也見過他的身影,但一直不知道是什么東西。直到當(dāng)前線程被或者獲取到資源,結(jié)束。簡(jiǎn)簡(jiǎn)單單把過一遍明天就看顯式鎖實(shí)現(xiàn)咯參考資料如果文章有錯(cuò)的地方歡迎指正,大家互相交流。為了大家方便,剛新建了一下群,大家也可以去交流交流。

前言

回顧前面:

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

Thread源碼剖析

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

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

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

本來我是打算在這章節(jié)中寫Lock的子類實(shí)現(xiàn)的,但看到了AQS的這么一個(gè)概念,可以說Lock的子類實(shí)現(xiàn)都是基于AQS的。

AQS我在面試題中也見過他的身影,但一直不知道是什么東西。所以本篇我就來講講AQS這個(gè)玩意吧,至少知道它的概念是什么,對(duì)吧~

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

一、AQS是什么?

首先我們來普及一下juc是什么:juc其實(shí)就是包的縮寫(java.util.concurrnt)

不要被人家唬到了,以為juc是什么一個(gè)牛逼的東西。其實(shí)指的是包而已~

我們可以發(fā)現(xiàn)lock包下有三個(gè)抽象的類:

AbstractOwnableSynchronizer

AbstractQueuedLongSynchronizer

AbstractQueuedSynchronizer

通常地:AbstractQueuedSynchronizer簡(jiǎn)稱為AQS

我們Lock之類的兩個(gè)常見的鎖都是基于它來實(shí)現(xiàn)的:

那么我們來看看AbstractQueuedSynchronizer到底是什么,看一個(gè)類是干什么的最快途徑就是看它的頂部注釋

通讀了一遍,可以總結(jié)出以下比較關(guān)鍵的信息:

AQS其實(shí)就是一個(gè)可以給我們實(shí)現(xiàn)鎖的框架

內(nèi)部實(shí)現(xiàn)的關(guān)鍵是:先進(jìn)先出的隊(duì)列、state狀態(tài)

定義了內(nèi)部類ConditionObject

擁有兩種線程模式

獨(dú)占模式

共享模式

在LOCK包中的相關(guān)鎖(常用的有ReentrantLock、 ReadWriteLock)都是基于AQS來構(gòu)建

一般我們叫AQS為同步器

二、簡(jiǎn)單看看AQS

上面也提到了AQS里邊最重要的是狀態(tài)和隊(duì)列,我們接下來就看看其源碼是怎么樣的...

2.1同步狀態(tài)

使用volatile修飾實(shí)現(xiàn)線程可見性:

修改state狀態(tài)值時(shí)使用CAS算法來實(shí)現(xiàn):

2.2先進(jìn)先出隊(duì)列

這個(gè)隊(duì)列被稱為:CLH隊(duì)列(三個(gè)名字組成),是一個(gè)雙向隊(duì)列

看看它隊(duì)列源碼的組成:

    static final class Node {
     
        // 共享
        static final Node SHARED = new Node();
      
        // 獨(dú)占
        static final Node EXCLUSIVE = null;

        // 線程被取消了
        static final int CANCELLED =  1;
  
        // 后繼線程需要喚醒
        static final int SIGNAL    = -1;
      
        // 等待condition喚醒
        static final int CONDITION = -2;
      
        // 共享式同步狀態(tài)獲取將會(huì)無條件地傳播下去(沒看懂)
        static final int PROPAGATE = -3;

        
        // 初始為0,狀態(tài)是上面的幾種
        volatile int waitStatus;

        // 前置節(jié)點(diǎn)
        volatile Node prev;

        // 后繼節(jié)點(diǎn)
        volatile Node next;


        volatile Thread thread;

       
        Node nextWaiter;

        final boolean isShared() {
            return nextWaiter == SHARED;
        }

       
        final Node predecessor() throws NullPointerException {
            Node p = prev;
            if (p == null)
                throw new NullPointerException();
            else
                return p;
        }

        Node() {    // Used to establish initial head or SHARED marker
        }

        Node(Thread thread, Node mode) {     // Used by addWaiter
            this.nextWaiter = mode;
            this.thread = thread;
        }

        Node(Thread thread, int waitStatus) { // Used by Condition
            this.waitStatus = waitStatus;
            this.thread = thread;
        }
    }
2.3acquire方法

獲取獨(dú)占鎖的過程就是在acquire定義的,該方法用到了模板設(shè)計(jì)模式,由子類實(shí)現(xiàn)的~

過程:acquire(int)嘗試獲取資源,如果獲取失敗,將線程插入等待隊(duì)列。插入等待隊(duì)列后,acquire(int)并沒有放棄獲取資源,而是根據(jù)前置節(jié)點(diǎn)狀態(tài)狀態(tài)判斷是否應(yīng)該繼續(xù)獲取資源,如果前置節(jié)點(diǎn)是頭結(jié)點(diǎn),繼續(xù)嘗試獲取資源,如果前置節(jié)點(diǎn)是SIGNAL狀態(tài),就中斷當(dāng)前線程,否則繼續(xù)嘗試獲取資源。直到當(dāng)前線程被park()或者獲取到資源,acquire(int)結(jié)束。

來源:

https://blog.csdn.net/panweiwei1994/article/details/78769703

2.4release方法

釋放獨(dú)占鎖的過程就是在acquire定義的,該方法也用到了模板設(shè)計(jì)模式,由子類實(shí)現(xiàn)的~

過程:首先調(diào)用子類的tryRelease()方法釋放鎖,然后喚醒后繼節(jié)點(diǎn),在喚醒的過程中,需要判斷后繼節(jié)點(diǎn)是否滿足情況,如果后繼節(jié)點(diǎn)不為且不是作廢狀態(tài),則喚醒這個(gè)后繼節(jié)點(diǎn),否則從tail節(jié)點(diǎn)向前尋找合適的節(jié)點(diǎn),如果找到,則喚醒.

來源:

https://zhuanlan.zhihu.com/p/27134110

三、最后

總結(jié)一下AQS到底是什么吧:

juc包中很多可阻塞的類都是基于AQS構(gòu)建的

AQS可以說是一個(gè)給予實(shí)現(xiàn)同步鎖、同步器的一個(gè)框架,很多實(shí)現(xiàn)類都在它的的基礎(chǔ)上構(gòu)建的

在AQS中實(shí)現(xiàn)了對(duì)等待隊(duì)列的默認(rèn)實(shí)現(xiàn),子類只要重寫部分的代碼即可實(shí)現(xiàn)(大量用到了模板代碼)

有興趣的同學(xué)可去看源碼和下面的鏈接繼續(xù)學(xué)習(xí),我這里就不講述了。簡(jiǎn)簡(jiǎn)單單把AQS過一遍~

明天就看Lock顯式鎖實(shí)現(xiàn)咯~~~

參考資料:

https://blog.csdn.net/panweiwei1994/article/details/78769703

https://zhuanlan.zhihu.com/p/27134110

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://www.ezyhdfw.cn/yun/69219.html

相關(guān)文章

  • Lock鎖子類了解一下

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

    時(shí)飛 評(píng)論0 收藏0
  • 線程池你真不來了解一下嗎?

    摘要:所以說我們的線程最好是交由線程池來管理,這樣可以減少對(duì)線程生命周期的管理,一定程度上提高性能。線程池不接收新任務(wù),不處理已添加的任務(wù),并且會(huì)中斷正在處理的任務(wù)。當(dāng)所有的任務(wù)已終止,記錄的任務(wù)數(shù)量為,線程池會(huì)變?yōu)闋顟B(tài)。線程池徹底終止的狀態(tài)。 前言 只有光頭才能變強(qiáng) 回顧前面: ThreadLocal就是這么簡(jiǎn)單 多線程三分鐘就可以入個(gè)門了! 多線程基礎(chǔ)必要知識(shí)點(diǎn)!看了學(xué)習(xí)多線程事半功倍...

    stdying 評(píng)論0 收藏0
  • 多線程之死鎖就是這么簡(jiǎn)單

    摘要:此時(shí)線程需要鎖才能繼續(xù)往下執(zhí)行。但是線程的鎖并沒有釋放,線程的鎖也沒有釋放。 前言 只有光頭才能變強(qiáng) 回顧前面: ThreadLocal就是這么簡(jiǎn)單 多線程三分鐘就可以入個(gè)門了! 多線程基礎(chǔ)必要知識(shí)點(diǎn)!看了學(xué)習(xí)多線程事半功倍 Java鎖機(jī)制了解一下 AQS簡(jiǎn)簡(jiǎn)單單過一遍 Lock鎖子類了解一下 線程池你真不來了解一下嗎? 本篇主要是講解死鎖,這是我在多線程的最后一篇了。主要將多線程...

    winterdawn 評(píng)論0 收藏0
  • Object對(duì)象你真理解了嗎?

    摘要:無論在中出現(xiàn)什么,都可以認(rèn)為它是對(duì)象除了八大基本數(shù)據(jù)類型。讓當(dāng)前線程等待某個(gè)對(duì)象的鎖,當(dāng)然應(yīng)該通過這個(gè)對(duì)象來操作了。但是要注意的是方法調(diào)用后,被喚醒的線程不會(huì)立馬獲得到鎖對(duì)象。主要的區(qū)別在于在釋放同時(shí),釋放了對(duì)象鎖的控制。 前言 五一回家又?jǐn)喔艘粋€(gè)放假時(shí)間了~~~ 只有光頭才能變強(qiáng) 回顧前面: ThreadLocal就是這么簡(jiǎn)單 多線程三分鐘就可以入個(gè)門了! 多線程基礎(chǔ)必要知識(shí)點(diǎn)!...

    anquan 評(píng)論0 收藏0
  • 逐行分析AQS源碼(2)——獨(dú)占鎖的釋放

    摘要:我們知道,這個(gè)函數(shù)將返回當(dāng)前正在執(zhí)行的線程的中斷狀態(tài),并清除它。注意,中斷對(duì)線程來說只是一個(gè)建議,一個(gè)線程被中斷只是其中斷狀態(tài)被設(shè)為線程可以選擇忽略這個(gè)中斷,中斷一個(gè)線程并不會(huì)影響線程的執(zhí)行。 前言 系列文章目錄 上一篇文章 我們逐行分析了獨(dú)占鎖的獲取操作, 本篇文章我們來看看獨(dú)占鎖的釋放。如果前面的鎖的獲取流程你已經(jīng)趟過一遍了, 那鎖的釋放部分就很簡(jiǎn)單了, 這篇文章我們直接開始看...

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

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

0條評(píng)論

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