欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java并發(fā)編程工具類JUC之LinkedBlockingQueue鏈表隊列

 更新時間:2021年06月03日 09:05:34   作者:字母哥博客  
大家都知道LinkedBlockingQueue 隊列是BlockingQueue接口的實現(xiàn)類,所以它具有BlockingQueue接口的一切功能特點,他還提供了兩種構(gòu)造函數(shù),本文中通過實例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧

java.util.concurrent.LinkedBlockingQueue 是一個基于單向鏈表的、范圍任意的(其實是有界的)、FIFO阻塞隊列。訪問與移除操作是在隊頭進(jìn)行,添加操作是在隊尾進(jìn)行,并分別使用不同的鎖進(jìn)行保護,只有在可能涉及多個節(jié)點的操作才同時對兩個鎖進(jìn)行加鎖。

隊列是否為空、是否已滿仍然是通過元素數(shù)量的計數(shù)器(count)進(jìn)行判斷的,由于可以同時在隊頭、隊尾并發(fā)地進(jìn)行訪問、添加操作,所以這個計數(shù)器必須是線程安全的,這里使用了一個原子類 AtomicInteger,這就決定了它的容量范圍是: 1 –Integer.MAX_VALUE。

在之前的文章中已經(jīng)為大家介紹了java并發(fā)編程的工具:BlockingQueue接口、ArrayBlockingQueue、DelayQueue。

LinkedBlockingQueue 隊列是BlockingQueue接口的實現(xiàn)類,所以它具有BlockingQueue接口的一切功能特點。LinkedBlockingQueue隊列 按照first-in-first-out (FIFO)先進(jìn)先出的方式對元素進(jìn)行排序。LinkeBlockingQueue 提供了兩種構(gòu)造函數(shù),一個構(gòu)造函數(shù)構(gòu)造一個隊列容量為固定個數(shù)的隊列,另一個無參構(gòu)造函數(shù)構(gòu)造一個隊列容量為Integer.MAX_VALUE的隊列.

public LinkedBlockingQueue() {
    this(Integer.MAX_VALUE);
}

public LinkedBlockingQueue(int capacity) {
    if (capacity <= 0) throw new IllegalArgumentException();
    this.capacity = capacity;
    last = head = new Node<E>(null);
}

ArrayBlockingQueue和LinkedBlockingQueue對比

ArrayBlockingQueue和LinkedBlockingQueue都是實現(xiàn)BlockingQueue接口,所以在使用方式上是一致的,下面我們就不介紹使用方法,而是從二者的性能及底層數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)角度進(jìn)行

ArrayBlockingQueue插入和刪除數(shù)據(jù),只采用了一個lock鎖,讀取和寫入操作無法并行。 所以在高并發(fā)場景下執(zhí)行效率會比LinkedBlockingQueue慢一些。

LinkedBlockingQueue采用“two lock queue”算法變體,雙鎖(ReentrantLock):takeLock、putLock,允許讀寫并行,remove(e)和迭代器iterators需要獲取2個鎖。這樣可以降低線程由于線程無法獲取到lock而進(jìn)入WAITING狀態(tài)的可能性,從而提高了線程并發(fā)執(zhí)行的效率。

ArrayBlockingQueue底層代碼是采用數(shù)組實現(xiàn)的,創(chuàng)建的時候必須指定隊列的容量并分配存儲空間;LinkedBlockingQueue采用的是鏈表數(shù)據(jù)結(jié)構(gòu)實現(xiàn)的,其鏈表節(jié)點的存儲空間分配是動態(tài)的,新的元素對象加入隊列分配空間,元素對象從隊列取出之后存儲空間GC,初始化時指定的是隊列的最大容量。但是使用鏈表數(shù)據(jù)結(jié)構(gòu)既是LinkedBlockingQueue優(yōu)勢也是它的劣勢,高并發(fā)場景下由于空間動態(tài)分配需要java JVM頻繁的進(jìn)行垃圾回收。

總體來說在并發(fā)場景下,LinkedBlockingQueue的吞吐量比ArrayBlockingQueue更好。但是在java實現(xiàn)高性能隊列的首選是disruptor,它不是JDK自帶的。java程序員非常熟悉的Log4j2底層性能比logback和log4j有了較大的提升,究其原因就是使用了disruptor高性能隊列實現(xiàn)的異步日志

到此這篇關(guān)于java并發(fā)編程工具類JUC之LinkedBlockingQueue鏈表隊列的文章就介紹到這了,更多相關(guān)java LinkedBlockingQueue鏈表隊列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中的Timer與TimerTask源碼及使用解析

    Java中的Timer與TimerTask源碼及使用解析

    這篇文章主要介紹了Java中的Timer與TimerTask源碼及使用解析,在Java中,經(jīng)常使用Timer來定時調(diào)度任務(wù),Timer調(diào)度任務(wù)有一次性調(diào)度和循環(huán)調(diào)度,循環(huán)調(diào)度有分為固定速率調(diào)度(fixRate)和固定時延調(diào)度(fixDelay),需要的朋友可以參考下
    2023-10-10
  • IntelliJ IDEA(2019)安裝破解及HelloWorld案例(圖文)

    IntelliJ IDEA(2019)安裝破解及HelloWorld案例(圖文)

    這篇文章主要介紹了IntelliJ IDEA(2019)安裝破解及HelloWorld案例(圖文),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Springboot如何根據(jù)實體類生成數(shù)據(jù)庫表

    Springboot如何根據(jù)實體類生成數(shù)據(jù)庫表

    這篇文章主要介紹了Springboot如何根據(jù)實體類生成數(shù)據(jù)庫表的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Mybatis中自定義TypeHandler處理枚舉的示例代碼

    Mybatis中自定義TypeHandler處理枚舉的示例代碼

    typeHandler,是 MyBatis 中的一個接口,用于處理數(shù)據(jù)庫中的特定數(shù)據(jù)類型,下面簡單介紹創(chuàng)建自定義 typeHandler 來處理枚舉類型的示例,感興趣的朋友跟隨小編一起看看吧
    2024-01-01
  • 手把手帶你入門 Spring Security的具體流程

    手把手帶你入門 Spring Security的具體流程

    這篇文章主要介紹了手把手帶你入門 Spring Security,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Mybatis-Plus環(huán)境配置與入門案例分析

    Mybatis-Plus環(huán)境配置與入門案例分析

    MyBatis-Plus 是一個 Mybatis 增強版工具,在 MyBatis 上擴充了其他功能沒有改變其基本功能,為了簡化開發(fā)提交效率而存在,本篇文章帶你配置環(huán)境并認(rèn)識它
    2022-03-03
  • jar中VO的探究

    jar中VO的探究

    這篇文章主要介紹了jar中VO的探究的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • IntelliJ IDEA 安裝目錄的核心文件的功能及用法

    IntelliJ IDEA 安裝目錄的核心文件的功能及用法

    這篇文章我們主要講解一下 IntelliJ IDEA 安裝目錄中的一些核心文件的功能及用法,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-10-10
  • Spring多線程通過@Scheduled實現(xiàn)定時任務(wù)

    Spring多線程通過@Scheduled實現(xiàn)定時任務(wù)

    這篇文章主要介紹了Spring多線程通過@Scheduled實現(xiàn)定時任務(wù),@Scheduled?定時任務(wù)調(diào)度注解,是spring定時任務(wù)中最重要的,下文關(guān)于其具體介紹,需要的小伙伴可以參考一下
    2022-05-05
  • SpringMVC中利用@InitBinder來對頁面數(shù)據(jù)進(jìn)行解析綁定的方法

    SpringMVC中利用@InitBinder來對頁面數(shù)據(jù)進(jìn)行解析綁定的方法

    本篇文章主要介紹了SpringMVC中利用@InitBinder來對頁面數(shù)據(jù)進(jìn)行解析綁定的方法,非常具有實用價值,需要的朋友可以參考下
    2018-03-03

最新評論