最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中ArrayBlockingQueue和LinkedBlockingQueue

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

ArrayBlockingQueue

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

LinkedBlockingQueue

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

相同:

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

不同:

1、鎖機(jī)制不同

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

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

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

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

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

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

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

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

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

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

1.sleep()方法

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

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

2.wait()方法

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

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

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

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

3.yield方法

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

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

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

4.join方法

等待該線程終止。

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

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

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

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

相關(guān)文章

  • Spring?JPA?deleteInBatch導(dǎo)致StackOverflow問(wèn)題

    Spring?JPA?deleteInBatch導(dǎo)致StackOverflow問(wèn)題

    這篇文章主要介紹了Spring?JPA?deleteInBatch導(dǎo)致StackOverflow問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 基于SpringBoot + Android實(shí)現(xiàn)登錄功能

    基于SpringBoot + Android實(shí)現(xiàn)登錄功能

    在移動(dòng)互聯(lián)網(wǎng)的今天,許多應(yīng)用需要通過(guò)移動(dòng)端實(shí)現(xiàn)與服務(wù)器的交互功能,其中登錄是最常見(jiàn)且基礎(chǔ)的一種功能,本篇博客將詳細(xì)介紹如何使用 Spring Boot 和 Android 實(shí)現(xiàn)一個(gè)完整的登錄功能,需要的朋友可以參考下
    2024-11-11
  • spring cloud 集成 ribbon負(fù)載均衡的實(shí)例代碼

    spring cloud 集成 ribbon負(fù)載均衡的實(shí)例代碼

    spring Cloud Ribbon 是一個(gè)客戶端的負(fù)載均衡器,它提供對(duì)大量的HTTP和TCP客戶端的訪問(wèn)控制。本文給大家介紹spring cloud 集成 ribbon負(fù)載均衡,感興趣的朋友跟隨小編一起看看吧
    2021-11-11
  • Java如何在List或Map遍歷過(guò)程中刪除元素

    Java如何在List或Map遍歷過(guò)程中刪除元素

    相信大家在日常的開(kāi)發(fā)過(guò)程中,經(jīng)常需要對(duì)List或Map里面的符合某種業(yè)務(wù)的數(shù)據(jù)進(jìn)行刪除,但是如果不了解里面的機(jī)制就容易掉入“陷阱”導(dǎo)致遺漏或者程序異常。下面這篇文章將會(huì)給大家詳細(xì)介紹Java如何在List和Map遍歷過(guò)程中刪除元素,有需要的朋友們可以參考借鑒。
    2016-12-12
  • Spring IOC源碼剖析_如何整體認(rèn)知Spring體系結(jié)構(gòu)

    Spring IOC源碼剖析_如何整體認(rèn)知Spring體系結(jié)構(gòu)

    這篇文章主要介紹了Spring IOC源碼剖析_如何整體認(rèn)知Spring體系結(jié)構(gòu)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 一起聊聊Java中的自定義異常

    一起聊聊Java中的自定義異常

    在學(xué)習(xí)Java的過(guò)程中,想必大家都一定學(xué)習(xí)過(guò)異常這個(gè)篇章,異常的基本特性和使用這里就不再多講了。本文就來(lái)和大家講講如何自定義異常
    2022-08-08
  • 基于Servlet實(shí)現(xiàn)技術(shù)問(wèn)答網(wǎng)站系統(tǒng)

    基于Servlet實(shí)現(xiàn)技術(shù)問(wèn)答網(wǎng)站系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了基于Servlet實(shí)現(xiàn)技術(shù)問(wèn)答網(wǎng)站系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Java中的鎖與鎖的狀態(tài)升級(jí)詳細(xì)解讀

    Java中的鎖與鎖的狀態(tài)升級(jí)詳細(xì)解讀

    這篇文章主要介紹了Java中的鎖與鎖的狀態(tài)升級(jí)詳細(xì)解讀,Java 1.6以后官方針對(duì)鎖的優(yōu)化,主要是增加了兩種新的鎖:偏向鎖和輕量級(jí)鎖,再加上本身重量級(jí)鎖,那么鎖基本上可以大致分為這三種,它們之間的區(qū)別主要是體現(xiàn)在等待時(shí)間上面,需要的朋友可以參考下
    2024-01-01
  • Spring空值和特殊字符的注入方式

    Spring空值和特殊字符的注入方式

    文章介紹了如何通過(guò)創(chuàng)建類、配置文件和測(cè)試代碼來(lái)實(shí)現(xiàn)空值和特殊字符注入,具體包括定義屬性、生成set方法、配置對(duì)象創(chuàng)建和屬性注入、以及編寫測(cè)試代碼進(jìn)行驗(yàn)證
    2024-11-11
  • Spring手動(dòng)生成web.xml配置文件過(guò)程詳解

    Spring手動(dòng)生成web.xml配置文件過(guò)程詳解

    這篇文章主要介紹了Spring手動(dòng)生成web.xml配置文件過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07

最新評(píng)論

年辖:市辖区| 长宁县| 宁化县| 灌阳县| 宁蒗| 桐城市| 台北市| 泸西县| 巴东县| 西和县| 青龙| 山东省| 巴东县| 陕西省| 辽阳市| 南郑县| 黄陵县| 城市| 肇州县| 上蔡县| 萨迦县| 荔浦县| 淅川县| 望都县| 比如县| 宁南县| 平果县| 周至县| 松原市| 万山特区| 石棉县| 望江县| 平凉市| 巨鹿县| 钦州市| 奇台县| 古交市| 大埔县| 广宁县| 融水| 阿鲁科尔沁旗|