精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

面試侃集合 | SynchronousQueue公平模式篇

開發 前端
SynchronousQueue和之前介紹過的隊列相比,稍微有一些特別,必須等到隊列中的元素被消費后,才能繼續向其中添加新的元素,因此它也被稱為無緩沖的等待隊列。

[[402359]]

面試官:呦,小伙子來的挺早啊!

Hydra:那是,不能讓您等太久了啊(別廢話了快開始吧,還趕著去下一場呢)。

面試官:前面兩輪表現還不錯,那我們今天繼續說說隊列中的SynchronousQueue吧。

Hydra:好的,SynchronousQueue和之前介紹過的隊列相比,稍微有一些特別,必須等到隊列中的元素被消費后,才能繼續向其中添加新的元素,因此它也被稱為無緩沖的等待隊列。

我還是先寫一個例子吧,創建兩個線程,生產者線程putThread向SynchronousQueue中放入元素,消費者線程takeThread從中取走元素:

  1. SynchronousQueue<Integer> queue=new SynchronousQueue<>(true); 
  2.  
  3. Thread putThread=new Thread(()->{ 
  4.     for (int i = 0; i <= 2; i++) { 
  5.         try { 
  6.             System.out.println("put thread put:"+i); 
  7.             queue.put(i); 
  8.             System.out.println("put thread put:"+i+" awake"); 
  9.         } catch (InterruptedException e) { 
  10.             e.printStackTrace(); 
  11.         } 
  12.     } 
  13. }); 
  14. Thread takeThread=new Thread(()->{ 
  15.     int j=0; 
  16.     while(j<2){ 
  17.         try { 
  18.             j=queue.take(); 
  19.             System.out.println("take from putThread:"+j); 
  20.         } catch (InterruptedException e) { 
  21.             e.printStackTrace(); 
  22.         } 
  23.     } 
  24. }); 
  25.  
  26. putThread.start(); 
  27. Thread.sleep(1000); 
  28. takeThread.start(); 

執行上面的代碼,查看結果:

  1. put thread put:0 
  2. take from putThread:0 
  3. put thread put:0 awake 
  4. put thread put:1 
  5. take from putThread:1 
  6. put thread put:1 awake 
  7. put thread put:2 
  8. take from putThread:2 
  9. put thread put:2 awake 

可以看到,生產者線程在執行put方法后就被阻塞,直到消費者線程執行take方法對隊列中的元素進行了消費,生產者線程才被喚醒,繼續向下執行。簡單來說運行流程是這樣的:

面試官:就這?應用誰不會啊,不講講底層原理就想蒙混過關?

Hydra:別急啊,我們先從它的構造函數說起,根據參數不同,SynchronousQueue分為公平模式和非公平模式,默認情況下為非公平模式

  1. public SynchronousQueue(boolean fair) { 
  2.     transferer = fair ? new TransferQueue<E>() : new TransferStack<E>(); 

我們先來看看公平模式吧,該模式下底層使用的是TransferQueue隊列,內部節點由QNode構成,定義如下:

  1. volatile QNode next;          // next node in queue 
  2. volatile Object item;         // CAS'ed to or from null 
  3. volatile Thread waiter;       // to control park/unpark 
  4. final boolean isData; 
  5. QNode(Object item, boolean isData) { 
  6.     this.item = item; 
  7.     this.isData = isData; 

item用來存儲數據,isData用來區分節點是什么類型的線程產生的,true表示是生產者,false表示是消費者,是后面用來進行節點匹配(complementary )的關鍵。在SynchronousQueue中匹配是一個非常重要的概念,例如一個線程先執行put產生了一個節點放入隊列,另一個線程再執行take產生了一個節點,這兩個不同類型的節點就可以匹配成功。

面試官:可是我看很多資料里說SynchronousQueue是一個不存儲元素的阻塞隊列,這點你是怎么理解的?

Hydra:通過上面節點中封裝的屬性,可以看出SynchronousQueue的隊列中封裝的節點更多針對的不是數據,而是要執行的操作,個人猜測這個說法的出發點就是隊列中存儲的節點更多偏向于操作這一屬性。

面試官:好吧,接著往下說隊列的結構吧。

Hydra:TransferQueue中主要定義的屬性有下面這些:

  1. transient volatile QNode head; 
  2. transient volatile QNode tail; 
  3. transient volatile QNode cleanMe; 
  4. TransferQueue() { 
  5.     QNode h = new QNode(nullfalse); // initialize to dummy node. 
  6.     head = h; 
  7.     tail = h; 

比較重要的有頭節點head、尾節點tail、以及用于標記下一個要刪除的節點的cleanMe節點。在構造函數初始化中創建了一個節點,注釋中將它稱為dummy node,也就是偽造的節點,它的作用類似于AQS中的頭節點的作用,實際操作的節點是它的下一個節點。

要說SynchronousQueue,真是一個神奇的隊列,不管你調用的是put和offer,還是take和poll,它都一概交給核心的transfer方法去處理,只不過參數不同。今天我們拋棄源碼,通過畫圖對它進行分析,首先看一下方法的定義:

  1. E transfer(E e, boolean timed, long nanos); 

面試官:呦呵,就一個方法?我倒要看看它是怎么區分實現的入隊和出隊操作…

Hydra:在方法的參數中,timed和nanos用于標識調用transfer的方法是否是能夠超時退出的,而e是否為空則可以說明是生產者還是消費者調用的此方法。如果e不為null,是生產者調用,如果e為null則是消費者調用。方法的整體邏輯可以分為下面幾步:

1、若隊列為空,或隊列中的尾節點類型和自己的類型相同,那么準備封裝一個新的QNode添加到隊列中。在添加新節點到隊尾的過程中,并沒有使用synchronized或ReentrantLock,而是通過CAS來保證線程之間的同步。

在添加新的QNode到隊尾前,會首先判斷之前取到的尾節點是否發生過改變,如果有改變的話那么放棄修改,進行自旋,在下一次循環中再次判斷。當檢查隊尾節點沒有發生改變后,構建新的節點QNode,并將它添加到隊尾。

2、當新節點被添加到隊尾后,會調用awaitFulfill方法,會根據傳遞的參數讓線程進行自旋或直接掛起。方法的定義如下,參數中的timed為true時,表示這是一個有等待超時的方法。

  1. Object awaitFulfill(QNode s, E e, boolean timed, long nanos); 

在awaitFulfill方法中會進行判斷,如果新節點是head節點的下一個節點,考慮到可能很快它就會完成匹配后出隊,先不將它掛起,進行一定次數的自旋,超過自旋次數的上限后再進行掛起。如果不是head節點的下一個節點,避免自旋造成的資源浪費,則直接調用park或parkNanos掛起線程。

3、當掛起的線程被中斷或到達超時時間,那么需要將節點從隊列中進行移除,這時會執行clean()方法。如果要被刪除的節點不是鏈表中的尾節點,那么比較簡單,直接使用CAS替換前一個節點的next指針。

如果要刪除的節點是鏈表中的尾節點,就會有點復雜了,因為多線程環境下可能正好有其他線程正在向尾節點后添加新的節點,這時如果直接刪除尾節點的話,會造成后面節點的丟失。

這時候就會用到TransferQueue中定義的cleanMe標記節點了,cleanMe的作用就是當要被移除的節點是隊尾節點時,用它來標記隊尾節點的前驅節點。具體在執行過程中,又會分為兩種情況:

  • cleanMe節點為null,說明隊列在之前沒有標記需要刪除的節點。這時會使用cleanMe來標識該節點的前驅節點,標記完成后退出clean方法,當下一次執行clean方法時才會刪除cleanMe的下一個節點。

  • cleanMe節點不為null,那么說明之前已經標記過需要刪除的節點。這時刪除cleanMe的下一個節點,并清除當前cleanMe標記,并再將當前節點未修改前的前驅節點標記為cleanMe。注意,當前要被刪除的節點的前驅節點不會發生改變,即使這個前驅節點已經在邏輯上從隊列中刪除掉了。

執行完成clean方法后,transfer方法會直接返回null,說明入隊操作失敗。

面試官:講了這么多,入隊的還都是一個類型的節點吧?

Hydra:是的,TransferQueue隊列中,只會存在一個類型的節點,如果有另一個類型的節點過來,那么就會執行出隊的操作了。

面試官:好吧,那你接著再說說出隊方法吧。

Hydra:相對入隊來說,出隊的邏輯就比較簡單了。因為現在使用的是公平模式,所以當隊列不為空,且隊列的head節點的下一個節點與當前節點匹配成功時,進行出隊操作,喚醒head節點的下一個節點,進行數據的傳遞。

根據隊列中節點類型的不同,可以分為兩種情況進行分析:

1、如果head節點的下一個節點是put類型,當前新節點是take類型。take線程取出put節點的item的值,并將其item變為null,然后推進頭節點,喚醒被掛起的put線程,take線程返回item的值,完成數據的傳遞過程。

head節點的下一個節點被喚醒后,會推進head節點,雖然前面說過隊列的head節點是一個dummy節點,并不存儲數據,理論上應該將第二個節點直接移出隊列,但是源碼中還是將head節點出隊,將原來的第二個節點變成了新的head節點。

2、同理,如果head節點的下一個節點是take類型,當前新節點是put類型。put線程會將take節點的item設為自己的數據值,然后推進頭節點,并喚醒掛起的take線程,喚醒的take線程最終返回從put線程獲得的item的值。

此外,在take線程喚醒后,會將自己QNode的item指針指向自己,并將waiter中保存的線程置為null,方便之后被gc回收。

面試官:也就是說,在代碼中不一定非要生產者先去生產產品,也可以由消費者先到達后進行阻塞等待?

Hydra:是的,兩種線程都可以先進入隊列。

面試官:好了,公平模式下我是明白了,我去喝口水,給你十分鐘時間,回來我們聊聊非公平模式的實現吧。

本文轉載自微信公眾號「碼農參上」,可以通過以下二維碼關注。轉載本文請聯系碼農參上公眾號。

 

責任編輯:武曉燕 來源: 碼農參上
相關推薦

2021-06-02 21:31:39

Synchronous非公平模式

2021-05-23 16:03:42

LinkedBlock面試阻塞隊列

2021-06-28 07:44:11

面試 DelayQueue任務調度

2021-05-17 07:36:54

ArrayBlocki面試集合

2021-11-02 10:43:34

Java面試安全

2021-03-03 17:26:45

面試Synchronous底層

2022-05-09 07:37:04

Java非公平鎖公平鎖

2021-01-18 10:48:51

DockerRedisMySQL

2012-08-09 10:02:08

面試Google

2012-08-14 10:31:28

面試

2012-08-21 09:20:57

Yahoo

2012-11-05 10:01:32

2021-10-11 19:54:04

JVM面試虛擬機

2022-12-26 00:00:04

公平鎖非公平鎖

2024-12-03 00:35:20

2022-07-12 08:56:18

公平鎖非公平鎖Java

2009-03-03 09:33:13

面試ORACLE

2016-12-20 18:21:29

Hadoop大數據面試

2018-08-21 13:25:01

編程語言Java面試題

2011-02-21 15:47:18

點贊
收藏

51CTO技術棧公眾號

国产免费拔擦拔擦8x高清在线人| av网站免费播放| 日本天堂一区| 欧美性视频一区二区三区| 中文字幕一区二区三区四区五区六区| 国产精品久久欧美久久一区| 在线播放不卡| 色偷偷91综合久久噜噜| 黑人玩弄人妻一区二区三区| 欧美aa免费在线| 中文字幕亚洲不卡| 精品国产电影| 91丨porny丨在线中文| 一本色道久久| 欧美大片va欧美在线播放| 网站免费在线观看| 粉嫩av国产一区二区三区| 福利视频导航一区| www.一区二区.com| 永久免费av在线| 91在线视频播放| 91亚洲国产成人久久精品网站| 毛片毛片女人毛片毛片| 欧美日韩国产在线一区| 视频直播国产精品| 9.1成人看片免费版| 欧美专区一区| 欧美绝品在线观看成人午夜影视 | av成人国产| 久久成人国产精品| 成人性视频免费看| 国产一区二区三区四区| 日韩av综合网| 亚洲婷婷在线观看| 欧美经典一区| 欧美一区二区私人影院日本| 日本久久久久久久久久久久| 北岛玲heyzo一区二区| 亚洲二区在线视频| 激情六月天婷婷| 岛国成人毛片| 综合久久国产九一剧情麻豆| 亚洲7777| 尤物在线视频| 亚洲欧美综合色| 亚洲精品一区国产精品| www.亚洲免费| 国产精品伦理在线| 亚洲国产一区二区三区在线| 国产一级在线| 亚洲国产精品精华液ab| 日韩黄色影视| h网站在线免费观看| 欧美高清在线视频| 一区二区三区av| 国产视频一区二区| 亚洲欧美日韩在线播放| 超碰10000| 亚洲色图美国十次| 亚洲国产另类av| 日韩伦理在线免费观看| 麻豆免费版在线观看| 天天射综合影视| 欧美a在线视频| 性欧美18一19sex性欧美| 色婷婷激情久久| 中文字幕在线观看第三页| 国产69精品久久| 欧美高清一级片在线| 91亚洲一区二区| 91精品国产自产在线丝袜啪| 亚洲精品电影久久久| 亚州av综合色区无码一区| 色天下一区二区三区| 亚洲日韩中文字幕| 少妇视频一区二区| 欧美涩涩网站| 日韩av色综合| 国产一区二区麻豆| 不卡欧美aaaaa| 日本一区二区三区在线视频| 免费黄网站在线| 亚洲自拍欧美精品| 国产精品-区区久久久狼| 国产精品久久乐| 日韩精品一区二区三区在线| 久久久久久久久免费看无码| 日韩欧美伦理| 亚洲91精品在线观看| 在线免费观看av网址| 国产在线看一区| 久久精品日产第一区二区三区乱码| 免费在线视频一级不卡| 亚洲免费av高清| 免费成人在线视频网站| 亚洲成人a级片| 日韩精品免费观看| 多男操一女视频| 国产精品视频久久一区| 国产精品一区二区三区久久| 刘亦菲久久免费一区二区| 久久精品在这里| 国产va亚洲va在线va| av成人在线看| 亚洲国产成人爱av在线播放| 久久视频一区二区三区| 亚洲日韩成人| 亚洲一区二区三区久久| 国产亚洲依依| 婷婷久久综合九色综合伊人色| 中文字幕av不卡在线| 日韩成人av在线资源| 欧美裸体男粗大视频在线观看| 亚洲欧美一二三区| 99re视频这里只有精品| 日日噜噜夜夜狠狠久久丁香五月| 经典三级一区二区| 亚洲国产精品女人久久久| 精品国产欧美日韩不卡在线观看| 石原莉奈一区二区三区在线观看| 国产另类自拍| 在线你懂的视频| 欧美高清视频一二三区| 免费黄色在线网址| 久久久久91| 精品久久久久久一区| 免费在线看电影| 91麻豆精品国产91久久久久久久久 | 在线丨暗呦小u女国产精品| 日韩av在线天堂| 国产精品一区一区| 午夜在线视频免费观看| 99精品国自产在线| 亚洲片在线资源| youjizz在线视频| 91丝袜呻吟高潮美腿白嫩在线观看| 日韩精品一区二区在线视频 | 日韩电影在线免费| 免费久久久一本精品久久区| yellow字幕网在线| 亚洲精品一区二区三区四区高清| 欧美精品videos极品| 国产精品99久久久| 国产91沈先生在线播放| 青草伊人久久| 久久99精品久久久久久琪琪| 国产成人精品亚洲精品色欲| 亚洲人成网站色在线观看| 久久久久久久久久一区| 亚洲成人精选| 亚洲综合日韩在线| 黑人另类精品××××性爽| 精品日产卡一卡二卡麻豆| 国产真人真事毛片| av在线这里只有精品| 国产91在线免费| 九九在线精品| 国产精品久久久久久久久久久久久久 | 精品国产黄色片| 亚洲精品老司机| 精品人妻一区二区免费| 99在线热播精品免费99热| 蜜桃视频在线观看91| 朝桐光一区二区| 国产成人av一区二区三区| 国产片高清在线观看| 亚洲精品视频免费看| 日本少妇一区二区三区| 在线国产日韩| 蜜桃av色综合| 久久人体av| 欧美成年人在线观看| 国精品人妻无码一区二区三区喝尿| 亚洲综合色成人| 亚洲最大的黄色网| 天堂av在线一区| 致1999电视剧免费观看策驰影院| 韩国一区二区三区视频| 久久久久日韩精品久久久男男| 午夜激情在线视频| 欧美性生活久久| 日本妇女毛茸茸| 99国产精品久久久久久久久久久 | 久久久人人人| 亚洲一区二区精品在线观看| 深夜福利一区二区三区| 欧美在线一级视频| 欧美成年黄网站色视频| 精品三级av在线| 中文字幕91爱爱| 亚洲一区在线观看免费观看电影高清 | 99在线免费视频观看| 精品国产91久久久久久浪潮蜜月| 91香蕉国产在线观看| 亚洲精品一区| 九色91av视频| bbbbbbbbbbb在线视频| 欧美va亚洲va在线观看蝴蝶网| 丁香社区五月天| 亚洲综合在线视频| 黄色免费一级视频| 99精品桃花视频在线观看| 一二三级黄色片| 久久尤物视频| 高清欧美精品xxxxx| 欧美肥老太太性生活| 开心色怡人综合网站| 日本免费一区二区视频| 国产精品久久久久久av下载红粉| 国产第一页在线视频| www.日本久久久久com.| 欧洲成人av| 精品国产污污免费网站入口 | 国内精品不卡在线| 免费看a级黄色片| 中文在线一区| 日本一区午夜艳熟免费| 久久久久蜜桃| 手机成人在线| 久久av网址| 久久精品二区| 一区中文字幕电影| 亚洲影院色无极综合| 51一区二区三区| 国产z一区二区三区| 女海盗2成人h版中文字幕| 久久久久久久久久久91| 在线看一级片| 久久躁日日躁aaaaxxxx| 欧美天天影院| www.日韩欧美| 搞黄视频免费在线观看| 亚洲三级免费看| 欧美91精品久久久久国产性生爱| 亚洲国产高清福利视频| 人人妻人人澡人人爽精品日本 | 国内自拍偷拍视频| 国产精品99久| 免费黄色在线播放| 国产成人午夜99999| 日韩不卡的av| 国产精品77777竹菊影视小说| 色男人天堂av| 国产精品亚洲一区二区三区在线| 亚洲高清av一区二区三区| 国内精品不卡在线| 4438x全国最大成人| 成人午夜免费av| 日本一区二区在线观看视频| 成人久久视频在线观看| 欧美肉大捧一进一出免费视频| 成人毛片视频在线观看| 亚洲乱码国产乱码精品精大量| 26uuu亚洲| 欧美大波大乳巨大乳| 国产精品网友自拍| 国产精品99久久久久久成人| 亚洲免费三区一区二区| 久久久精品91| 精品久久中文字幕久久av| 亚洲影院在线播放| 欧美熟乱第一页| 国产美女免费看| 日韩精品中午字幕| 偷拍自拍在线| 在线电影欧美日韩一区二区私密| 色综合久久影院| 欧美区二区三区| 午夜不卡影院| 国产日韩专区在线| 亚洲图色一区二区三区| 国产一区二区无遮挡| 国语产色综合| 男女h黄动漫啪啪无遮挡软件| 国产精品mm| 欧美激情成人网| 国产自产高清不卡| 毛茸茸多毛bbb毛多视频| 国产精品美女久久久久久久久久久 | 激情在线视频| 不卡毛片在线看| 忘忧草在线影院两性视频| 国产欧美日韩综合精品| 国产成人av毛片| 水蜜桃一区二区| 亚洲一级高清| wwww.国产| 成人黄色在线视频| 欧美一区二区三区观看| 亚洲成人高清在线| 亚洲午夜激情视频| 亚洲国产精品字幕| 欧美13一16娇小xxxx| 91精品国产91久久久久| 亚洲一区二区小说| 蜜桃999成人看片在线观看| 欧美国产综合| 91制片厂毛片| 91美女在线观看| 欧美激情精品久久| 欧美色窝79yyyycom| 日批视频免费播放| 久久精品国产欧美激情| 久久sese| 精品国产乱码久久久久久108| 久久一区二区中文字幕| av观看免费在线| 成人一区二区三区视频| 国产美女高潮视频| 在线视频中文字幕一区二区| 日韩永久免费视频| 欧美精品一二区| 国产亚洲人成a在线v网站| 久久久精品国产一区二区三区| 欧美va天堂在线| 99九九99九九九99九他书对| 久久久精品黄色| 天天干在线播放| 亚洲精品国产精品自产a区红杏吧| 高h视频在线观看| 国产欧美精品久久久| 国产一区二区三区四区二区| 欧美 丝袜 自拍 制服 另类| 国产精品亚洲专一区二区三区 | 国产大片在线免费观看| 69**夜色精品国产69乱| 成人爽a毛片| 国产精品免费看久久久无码| 精品综合免费视频观看| 欧美日韩国产一二三区| 在线免费观看视频一区| 蜜桃免费在线| 日韩免费av片在线观看| 亚洲免费福利一区| 日韩欧美精品在线观看视频| 91在线视频观看| 国产www在线| 亚洲成色777777在线观看影院| 在线看三级电影| 国产不卡一区二区三区在线观看| 欧美日韩四区| 师生出轨h灌满了1v1| 亚洲一区二区三区中文字幕在线| 精品人妻伦一二三区久久 | 在线视频欧美一区| 精品一二三四区| 午夜爽爽爽男女免费观看| 欧美一区二区高清| 久久不射影院| 久久久99爱| 日韩精品一二三四| 亚洲色图100p| 91麻豆精品国产无毒不卡在线观看| 超碰最新在线| 国产精品swag| 香蕉av777xxx色综合一区| 国产又大又粗又爽的毛片| 欧美色综合影院| av文字幕在线观看| 国产日韩欧美精品| 丝袜美腿一区二区三区| 亚洲一级片在线播放| 91精品欧美综合在线观看最新| 午夜伦理在线视频| 精品一区二区久久久久久久网站| 久久成人一区| 潘金莲一级黄色片| 亚洲精品一区二区三区影院| 成人美女大片| 正在播放国产精品| 波多野结衣视频一区| 看黄色一级大片| 久久久精品视频成人| 亚洲天堂中文字幕在线观看| 日韩av资源在线| 亚洲日本丝袜连裤袜办公室| 人妻偷人精品一区二区三区| 国产精品久久久久久久7电影| 午夜电影亚洲| 国产制服丝袜在线| 欧美欧美午夜aⅴ在线观看| 波多野结衣乳巨码无在线观看| 欧美精品免费观看二区| 狠狠网亚洲精品| 欧美日韩乱国产| 俺也去精品视频在线观看| 欧美大胆a级| 日日干日日操日日射| 欧美日韩一区二区免费在线观看| 免费黄色网址在线观看| 精品视频一区在线| 国产在线精品不卡| 91午夜精品亚洲一区二区三区| 久久九九全国免费精品观看| 色吊丝一区二区| 亚洲黄色小说在线观看| 欧美视频一区二区三区在线观看 | 国产人妻人伦精品1国产丝袜| 欧美日高清视频| 高清不卡av|