国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java并發(fā)編程 LinkedBlockingDeque詳解

這篇具有很好參考價(jià)值的文章主要介紹了java并發(fā)編程 LinkedBlockingDeque詳解。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。


java 并發(fā)編程系列文章目錄

1 LinkedBlockingDeque是什么

首先queue是一種數(shù)據(jù)結(jié)構(gòu),一個(gè)集合中,先進(jìn)后出,有兩種實(shí)現(xiàn)的方式,數(shù)組和鏈表。從尾部追加,從頭部獲取。Deque是兩端都可以添加,且兩端都可以獲取,所以它的方法會(huì)有一系列的Last,F(xiàn)rist語義,添加或獲取等操作會(huì)指明哪個(gè)方向的,這也是Deque接口的定義。
那如果你不指定語義 如add()方法,他會(huì)默認(rèn)調(diào)用addLast
綜上所述,LinkedBlockingDeque是一個(gè)線程安全的雙端阻塞隊(duì)列。

2 核心屬性詳解

相對(duì)于LinkedBlockingQueue 他只能使用一把鎖,不能分成put 和 take兩把鎖。因?yàn)榇藭r(shí)雙端都可以put 和 take,所以只能使用一個(gè)鎖,通過鎖,對(duì)其鏈表實(shí)現(xiàn)線程安全的操作。

	//隊(duì)列的頭尾節(jié)點(diǎn)
    transient Node<E> first;
    transient Node<E> last;

    //隊(duì)列中元素的數(shù)量
    private transient int count;

    //指定的隊(duì)列的容量,默認(rèn)Int最大值
    private final int capacity;

    //實(shí)現(xiàn)線程安全的使用的鎖
    final ReentrantLock lock = new ReentrantLock();

    //獲取元素的時(shí)候如果空了會(huì)使用它讓其自己等待
    private final Condition notEmpty = lock.newCondition();

    //添加元素的時(shí)候如果滿了(count == capacity)會(huì)使用它讓其自己等待
    private final Condition notFull = lock.newCondition();

3 核心方法詳解

下面會(huì)列舉First系列的方法,因?yàn)閘ast系列相對(duì)于first只是鏈表方向不一樣,操作都是一致的。

3.1 addFirst(E e)

調(diào)用offerFirst 如果未成功 則拋出異常

    public void addFirst(E e) {
        if (!offerFirst(e))
            throw new IllegalStateException("Deque full");
    }

3.2 offerFirst(E e)

在鏈表的頭部添加一個(gè)元素,使用ReentrantLock 保證線程安全

    public boolean offerFirst(E e) {
        if (e == null) throw new NullPointerException();
        Node<E> node = new Node<E>(e);
        //獲取鎖
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
        	//把當(dāng)前元素對(duì)應(yīng)的節(jié)點(diǎn)放到頭結(jié)點(diǎn)那里
            return linkFirst(node);
        } finally {
            lock.unlock();
        }
    }
    private boolean linkFirst(Node<E> node) {
    	//如果元素已經(jīng)超出容量,返回添加失敗
        if (count >= capacity)
            return false;
        //鏈表的操作,用的是雙向鏈表,first變成自己,之前的first是自己的next
        Node<E> f = first;
        node.next = f;
        first = node;
        if (last == null)
            last = node;
        else
            f.prev = node;
        //元素統(tǒng)計(jì)數(shù)量加1
        ++count;
        //喚醒那些因?yàn)楂@取不到元素而阻塞的線程
        notEmpty.signal();
        return true;
    }

3.3 putFirst(E e)

相對(duì)于offer一個(gè)元素 如果元素?cái)?shù)量已到達(dá)容量上線,會(huì)阻塞住等待元素被取走才放入
在juc下面 put add take等語義都是一致的

    public void putFirst(E e) throws InterruptedException {
        if (e == null) throw new NullPointerException();
        Node<E> node = new Node<E>(e);
        //獲取鎖
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
        	//添加失敗就阻塞住等待喚醒
            while (!linkFirst(node))
                notFull.await();
        } finally {
            lock.unlock();
        }
    }

3.4 removeFirst()

從頭結(jié)點(diǎn)移除一個(gè)元素,調(diào)用的是pollFirst,拿出元素返回,元素==null會(huì)拋出異常

    public E removeFirst() {
        E x = pollFirst();
        if (x == null) throw new NoSuchElementException();
        return x;
    }

3.5 pollFirst()

取出first元素并返回,會(huì)返回null

    public E pollFirst() {
    	//加鎖
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
        	// 取出first, 鏈表的操作和count的維護(hù)以及喚醒添加元素因?yàn)槿萘康竭_(dá)上線的等待的線程
            return unlinkFirst();
        } finally {
            lock.unlock();
        }
    }

3.6 takeFirst()

獲取一個(gè)first元素,區(qū)別poll 在于會(huì)阻塞等待

    public E takeFirst() throws InterruptedException {
        final ReentrantLock lock = this.lock;
        //獲取鎖
        lock.lock();
        try {
            E x;
            //拿不到就阻塞等待,等待添加元素的時(shí)候被其他線程喚醒
            while ( (x = unlinkFirst()) == null)
                notEmpty.await();
            return x;
        } finally {
            lock.unlock();
        }
    }

3.7 其他

對(duì)于last系列方法,只是鏈表的操作方向不一樣而已
其次默認(rèn)的不帶last 和 first系列的方法,即原始的add put等方法,可以等同LinkedBlockingQueue。
LinkedBlockingDeque內(nèi)部是一個(gè)雙向鏈表,支持了鏈表兩端操作,所以方法不一一介紹,原理都是一樣。

4 總結(jié)

LinkedBlockingDeque使用雙端隊(duì)列,通過ReentrantLock保證線程安全,實(shí)現(xiàn)了雙端的線程安全的阻塞隊(duì)列。文章來源地址http://www.zghlxwxcb.cn/news/detail-691951.html

到了這里,關(guān)于java并發(fā)編程 LinkedBlockingDeque詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Java 并發(fā)編程】Java 線程本地變量 ThreadLocal 詳解

    【Java 并發(fā)編程】Java 線程本地變量 ThreadLocal 詳解

    先一起看一下 ThreadLocal 類的官方解釋: 用大白話翻譯過來,大體的意思是: ThreadLoal 提供給了 線程局部變量 。同一個(gè) ThreadLocal 所包含的對(duì)象,在不同的 Thread 中有不同的副本。這里有幾點(diǎn)需要注意: 因?yàn)槊總€(gè) Thread 內(nèi)有自己的實(shí)例副本,且 該副本只能由當(dāng)前 Thread 使用 。

    2024年02月04日
    瀏覽(31)
  • 【Java 并發(fā)編程】一文詳解 Java 內(nèi)置鎖 synchronized

    【Java 并發(fā)編程】一文詳解 Java 內(nèi)置鎖 synchronized

    存在共享數(shù)據(jù); 多線程共同操作共享數(shù)。 synchronized 可以保證在同一時(shí)刻,只有一個(gè)線程可以執(zhí)行某個(gè)方法或某個(gè)代碼塊,同時(shí) synchronized 可以保證一個(gè)線程的變化可見(可見性),即可以代替 volatile。 多線程編程中,有可能會(huì)出現(xiàn)多個(gè)線程同時(shí)訪問同一個(gè)共享、可變

    2024年02月02日
    瀏覽(24)
  • java并發(fā)編程 AbstractQueuedSynchronizer(AQS)詳解一

    AQS在類的注釋上說的已經(jīng)很明白,提供一個(gè)框架,用于實(shí)現(xiàn)依賴先進(jìn)先出(FIFO)等待隊(duì)列的阻塞鎖和相關(guān)同步器(信號(hào)量、事件等)。此類被設(shè)計(jì)做為大多數(shù)類型的同步器的一個(gè)有用的基礎(chǔ)類,這些同步器依賴于單個(gè)原子int值(state字段)來表示狀態(tài)。 java 并發(fā)編程系列文章

    2024年02月10日
    瀏覽(21)
  • Java并發(fā)編程第6講——線程池(萬字詳解)

    Java并發(fā)編程第6講——線程池(萬字詳解)

    Java中的線程池是運(yùn)用場(chǎng)景最多的并發(fā)框架,幾乎所有需要異步或并發(fā)執(zhí)行任務(wù)的程序都可以使用線程池,本篇文章就詳細(xì)介紹一下。 定義:線程池是一種用于管理和重用線程的技術(shù)(池化技術(shù)),它主要用于提高多線程應(yīng)用程序的性能和效率。 ps:線程池、連接池、內(nèi)存池

    2024年02月11日
    瀏覽(27)
  • 【并發(fā)編程】Java的Future機(jī)制詳解(Future接口和FutureTask類)

    【并發(fā)編程】Java的Future機(jī)制詳解(Future接口和FutureTask類)

    目錄 一、徹底理解Java的Future模式 二、為什么出現(xiàn)Future機(jī)制 2.1 Future 類有什么用? 三、Future的相關(guān)類圖 2.1 Future 接口 2.2 FutureTask 類 五、FutureTask源碼分析 5.1 state字段 5.2 其他變量 5.3 CAS工具初始化 5.4 構(gòu)造函數(shù) 5.5 jdk1.8和之前版本的區(qū)別 六、Callable 和 Future 有什么關(guān)系? 七、

    2024年02月03日
    瀏覽(25)
  • ElasticSearch 中的中文分詞器以及索引基本操作詳解,Java高并發(fā)編程詳解深入理解pdf

    ElasticSearch 中的中文分詞器以及索引基本操作詳解,Java高并發(fā)編程詳解深入理解pdf

    PUT book/_settings { “number_of_replicas”: 2 } 修改成功后,如下: 更新分片數(shù)也是一樣。 2.3 修改索引的讀寫權(quán)限 索引創(chuàng)建成功后,可以向索引中寫入文檔: PUT book/_doc/1 { “title”:“三國演義” } 寫入成功后,可以在 head 插件中查看: 默認(rèn)情況下,索引是具備讀寫權(quán)限的,當(dāng)然這

    2024年04月09日
    瀏覽(26)
  • Golang 并發(fā)編程詳解

    并發(fā)是現(xiàn)代軟件開發(fā)中的一個(gè)重要概念,它允許程序同時(shí)執(zhí)行多個(gè)任務(wù),提高系統(tǒng)的性能和響應(yīng)能力。Golang 是一門天生支持并發(fā)的語言,它通過 goroutine 和 channel 提供了強(qiáng)大的并發(fā)編程支持。 在本文中,我們將深入探討 Golang 中的并發(fā)編程,了解 goroutine、channel 以及一些常見

    2024年01月23日
    瀏覽(16)
  • 【并發(fā)編程篇】詳解Forkjoin

    【并發(fā)編程篇】詳解Forkjoin

    Fork/Join 是一種在多線程領(lǐng)域中常用的算法或技術(shù), 它的核心思想是將大任務(wù)分割成若干個(gè)小任務(wù),然后將這些小任務(wù)分配給多個(gè)線程并行處理,最終將結(jié)果合并起來 。這種思想可以應(yīng)用于多種場(chǎng)景,例如圖像處理、批處理、并行排序等。 在 Java 中,F(xiàn)ork/Join 這種思想被封裝

    2024年01月17日
    瀏覽(18)
  • JUC并發(fā)編程之volatile詳解

    JUC并發(fā)編程之volatile詳解

    目錄 ? 1. volatile 1.1?volatile的作用 1.1.1?變量可見性 1.1.2?禁止指令重排序 1.2 volatile可見性案例 1.3 volatile非原子性案例 1.4 volatile 禁止重排序 1.5 volatile 日常使用場(chǎng)景 送書活動(dòng) ? 在并發(fā)編程中,多線程操作共享的變量時(shí),可能會(huì)導(dǎo)致線程安全問題,如數(shù)據(jù)競(jìng)爭(zhēng)、可見性

    2024年02月14日
    瀏覽(22)
  • 【java】開發(fā)——《并發(fā)編程》

    【java】開發(fā)——《并發(fā)編程》

    目錄 一.jmm 二.并發(fā)了什么 1.只有一個(gè)核(單核)并發(fā)還有沒有意義 2.單核,還有什么可見性問題 3.并發(fā)和并行 三.volitaile 1.變量的可見性問題 2.原因是什么 3.本次修改的變量直接刷到主內(nèi)存 4.聲明其他內(nèi)存對(duì)于這個(gè)地址的緩存無效 四.happens-befo 1.順序性問題 五.volitaile+cas 1.原

    2024年02月22日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包