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

Java中ArrayBlockingQueue和LinkedBlockingQueue

 更新時間:2022年09月02日 09:25:22   作者:樂活青年  
這篇文章主要介紹了Java中ArrayBlockingQueue和LinkedBlockingQueue,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下

ArrayBlockingQueue

用數(shù)組實現(xiàn)的有界阻塞隊列。此隊列按照先進(jìn)先出(FIFO)的原則對元素進(jìn)行排序。默認(rèn)情況下不保證訪問者公平的訪問隊列,所謂公平訪問隊列是指阻塞的所有生產(chǎn)者線程或消費(fèi)者線程,當(dāng)隊列可用時,可以按照阻塞的先后順序訪問隊列,即先阻塞的生產(chǎn)者線程,可以先往隊列里插入元素,先阻塞的消費(fèi)者線程,可以先從隊列里獲取元素。通常情況下為了保證公平性會降低吞吐量。

LinkedBlockingQueue

基于鏈表的阻塞隊列,同ArrayListBlockingQueue類似,此隊列按照先進(jìn)先出(FIFO)的原則對元素進(jìn)行排序,其內(nèi)部也維持著一個數(shù)據(jù)緩沖隊列(該隊列由一個鏈表構(gòu)成),當(dāng)生產(chǎn)者往隊列中放入一個數(shù)據(jù)時,隊列會從生產(chǎn)者手中獲取數(shù)據(jù),并緩存在隊列內(nèi)部,而生產(chǎn)者立即返回;只有當(dāng)隊列緩沖區(qū)達(dá)到最大值緩存容量時(LinkedBlockingQueue可以通過構(gòu)造函數(shù)指定該值),才會阻塞生產(chǎn)者隊列,直到消費(fèi)者從隊列中消費(fèi)掉一份數(shù)據(jù),生產(chǎn)者線程會被喚醒,反之對于消費(fèi)者這端的處理也基于同樣的原理。而LinkedBlockingQueue之所以能夠高效的處理并發(fā)數(shù)據(jù),還因為其對于生產(chǎn)者端和消費(fèi)者端分別采用了獨(dú)立的鎖來控制數(shù)據(jù)同步,這也意味著在高并發(fā)的情況下生產(chǎn)者和消費(fèi)者可以并行地操作隊列中的數(shù)據(jù),以此來提高整個隊列的并發(fā)性能。
作為開發(fā)者,我們需要注意的是,如果構(gòu)造一個LinkedBlockingQueue對象,而沒有指定其容量大小,LinkedBlockingQueue會默認(rèn)一個類似無限大小的容量(Integer.MAX_VALUE),這樣的話,如果生產(chǎn)者的速度一旦大于消費(fèi)者的速度,也許還沒有等到隊列滿阻塞產(chǎn)生,系統(tǒng)內(nèi)存就有可能已被消耗殆盡了。

相同:

  • LinkedBlockingQueue和ArrayBlockingQueue都是可阻塞的隊列
  • 內(nèi)部都是使用ReentrantLock和Condition來保證生產(chǎn)和消費(fèi)的同步;
  • 當(dāng)隊列為空,消費(fèi)者線程被阻塞;當(dāng)隊列裝滿,生產(chǎn)者線程被阻塞;
  • 使用Condition的方法來同步和通信:await()和signal()

不同:

1、鎖機(jī)制不同

  • LinkedBlockingQueue中的鎖是分離的,生產(chǎn)者的鎖PutLock,消費(fèi)者的鎖takeLock
  • 而ArrayBlockingQueue生產(chǎn)者和消費(fèi)者使用的是同一把鎖;

2、底層實現(xiàn)機(jī)制也不同

  • LinkedBlockingQueue內(nèi)部維護(hù)的是一個鏈表結(jié)構(gòu)。
  • 在生產(chǎn)和消費(fèi)的時候,需要創(chuàng)建Node對象進(jìn)行插入或移除,大批量數(shù)據(jù)的系統(tǒng)中,其對于GC的壓力會比較大。
  • 而ArrayBlockingQueue內(nèi)部維護(hù)了一個數(shù)組
  • 在生產(chǎn)和消費(fèi)的時候,是直接將枚舉對象插入或移除的,不會產(chǎn)生或銷毀任何額外的對象實例。

3、構(gòu)造時候的區(qū)別

  • LinkedBlockingQueue有默認(rèn)的容量大小為:Integer.MAX_VALUE,當(dāng)然也可以傳入指定的容量大小
  • ArrayBlockingQueue在初始化的時候,必須傳入一個容量大小的值

4、執(zhí)行clear()方法

  • LinkedBlockingQueue執(zhí)行clear方法時,會加上兩把鎖

 5、統(tǒng)計元素的個數(shù)

  • LinkedBlockingQueue中使用了一個AtomicInteger對象來統(tǒng)計元素的個數(shù),ArrayBlockingQueue則使用int類型來統(tǒng)計元素。

補(bǔ)充(Java些操使線程釋放鎖資源)

1.sleep()方法

在指定時間內(nèi)讓當(dāng)前正在執(zhí)行的線程暫停執(zhí)行,但不會釋放“鎖標(biāo)志”。不推薦使用。

sleep()使當(dāng)前線程進(jìn)入阻塞狀態(tài),在指定時間內(nèi)不會執(zhí)行。

2.wait()方法

在其他線程調(diào)用對象的notify或notifyAll方法前,導(dǎo)致當(dāng)前線程等待。線程會釋放掉它所占有的“鎖標(biāo)志”,從而使別的線程有機(jī)會搶占該鎖。

當(dāng)前線程必須擁有當(dāng)前對象鎖。如果當(dāng)前線程不是此鎖的擁有者,會拋出IllegalMonitorStateException異常。

喚醒當(dāng)前對象鎖的等待線程使用notify或notifyAll方法,也必須擁有相同的對象鎖,否則也會拋出IllegalMonitorStateException異常。

waite()和notify()必須在synchronized函數(shù)或synchronized block中進(jìn)行調(diào)用。如果在non-synchronized函數(shù)或non-synchronized block中進(jìn)行調(diào)用,雖然能編譯通過,但在運(yùn)行時會發(fā)生IllegalMonitorStateException的異常。

3.yield方法

暫停當(dāng)前正在執(zhí)行的線程對象。

yield()只是使當(dāng)前線程重新回到可執(zhí)行狀態(tài),所以執(zhí)行yield()的線程有可能在進(jìn)入到可執(zhí)行狀態(tài)后馬上又被執(zhí)行。

yield()只能使同優(yōu)先級或更高優(yōu)先級的線程有執(zhí)行的機(jī)會。

4.join方法

等待該線程終止。

等待調(diào)用join方法的線程結(jié)束,再繼續(xù)執(zhí)行。如:t.join();//主要用于等待t線程運(yùn)行結(jié)束,若無此句,main則會執(zhí)行完畢,導(dǎo)致結(jié)果不可預(yù)測。

join()底層就是調(diào)用wait()方法的,wait()釋放鎖資源,故join也釋放鎖資源

  • 1.sleep會使當(dāng)前線程睡眠指定時間,不釋放鎖
  • 2.yield會使當(dāng)前線程重回到可執(zhí)行狀態(tài),等待cpu的調(diào)度,不釋放鎖
  • 3.wait會使當(dāng)前線程回到線程池中等待,釋放鎖,當(dāng)被其他線程使用notify,notifyAll喚醒時進(jìn)入可執(zhí)行狀態(tài)
  • 4.當(dāng)前線程調(diào)用 某線程.join()時會使當(dāng)前線程等待某線程執(zhí)行完畢再結(jié)束,底層調(diào)用了wait,釋放鎖

到此這篇關(guān)于Java中ArrayBlockingQueue和LinkedBlockingQueue的文章就介紹到這了,更多相關(guān)Java ArrayBlockingQueue內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實現(xiàn)八皇后問題示例分享

    java實現(xiàn)八皇后問題示例分享

    這篇文章主要介紹了java實現(xiàn)八皇后問題示例,八皇后問題,是一個古老而著名的問題,是回溯算法的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾于1848年提出
    2014-03-03
  • java數(shù)字和中文算數(shù)驗證碼的實現(xiàn)

    java數(shù)字和中文算數(shù)驗證碼的實現(xiàn)

    這篇文章主要介紹了java數(shù)字和中文算數(shù)驗證碼的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • springcloud?nacos動態(tài)線程池Dynamic?tp配置接入實戰(zhàn)詳解

    springcloud?nacos動態(tài)線程池Dynamic?tp配置接入實戰(zhàn)詳解

    這篇文章主要為大家介紹了springcloud?nacos動態(tài)線程池Dynamic?tp配置接入實戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 一文帶你了解Java排序算法

    一文帶你了解Java排序算法

    這篇文章主要為大家詳細(xì)介紹了Java中常見的三個排序算法:選擇排序,冒泡排序和插入排序,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-08-08
  • 解決SpringBoot中的Scheduled單線程執(zhí)行問題

    解決SpringBoot中的Scheduled單線程執(zhí)行問題

    在一次SpringBoot中使用Scheduled定時任務(wù)時,發(fā)現(xiàn)某一個任務(wù)出現(xiàn)執(zhí)行占用大量資源,會導(dǎo)致其他任務(wù)也執(zhí)行失敗,這篇文章主要介紹了SpringBoot中的Scheduled單線程執(zhí)行問題及解決方法,需要的朋友可以參考下
    2022-06-06
  • java統(tǒng)計字符串單詞個數(shù)的方法解析

    java統(tǒng)計字符串單詞個數(shù)的方法解析

    在一些項目中可能需要對一段字符串中的單詞進(jìn)行統(tǒng)計,本文在這里分享了一個簡單的demo,有需要的朋友可以拿去看一下
    2017-01-01
  • java 靜態(tài)工廠代替多參構(gòu)造器的適用情況與優(yōu)劣

    java 靜態(tài)工廠代替多參構(gòu)造器的適用情況與優(yōu)劣

    這篇文章主要介紹了java 靜態(tài)工廠代替多參構(gòu)造器的優(yōu)劣,幫助大家更好的理解和使用靜態(tài)工廠方法,感興趣的朋友可以了解下
    2020-12-12
  • 基于Java Callable接口實現(xiàn)線程代碼實例

    基于Java Callable接口實現(xiàn)線程代碼實例

    這篇文章主要介紹了基于Java Callable接口實現(xiàn)線程代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • Java計時新姿勢StopWatch的使用方法詳解

    Java計時新姿勢StopWatch的使用方法詳解

    這篇文章主要給大家介紹了關(guān)于Java計時新姿勢StopWatch的相關(guān)資料,以及java 中使用StopWatch來計算時間差的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-01-01
  • 詳解如何熱更新線上的Java服務(wù)器代碼

    詳解如何熱更新線上的Java服務(wù)器代碼

    這篇文章主要介紹了詳解如何熱更新線上的Java服務(wù)器代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04

最新評論