精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

夜夜嗨aⅴ一区二区三区| 国产免费一区二区三区最新6| 97超碰资源站| 欧美激情视频一区二区三区在线播放| 在线观看日韩一区| 日本丰满少妇黄大片在线观看| 中文无码精品一区二区三区| 亚洲欧洲中文字幕| 亚洲欧美综合v| www.色就是色.com| 成人在线免费看片| a在线播放不卡| 国产欧美日韩中文字幕| 中文乱码字幕高清一区二区| 精品三级在线观看视频| 欧美精品丝袜久久久中文字幕| 日本一区免费在线观看| 奴色虐av一区二区三区| 狠久久av成人天堂| 在线观看视频亚洲| 欧美一级片黄色| 国产高清日韩| 欧美亚洲国产一卡| 日韩精品一区二区三区久久| 呦呦在线视频| 国产精品人人做人人爽人人添| 国产综合在线观看视频| 天堂网一区二区三区| 欧美伊人久久| 久久精品2019中文字幕| 国产亚洲精品熟女国产成人| 日本在线中文字幕一区二区三区| 中文一区在线播放| 亚洲在线视频福利| 日本肉体xxxx裸体xxx免费| 欧美极品少妇videossex| 亚洲欧洲精品一区二区三区 | 在线观看电影av| 中文字幕第一区二区| 欧美日韩三区四区| 手机亚洲第一页| 成人av在线电影| 国产精品白丝jk白祙| 97人妻人人澡人人爽人人精品| 综合色一区二区| 日韩小视频在线观看| 亚洲一级黄色录像| 风间由美一区二区av101 | 夜夜嗨av一区二区三区免费区| 我要看一级黄色大片| 三上悠亚激情av一区二区三区| 蜜乳av一区二区三区| 欧美亚洲国产另类| 91视频免费在观看| 国产精品一区二区av交换| 欧美精品一卡两卡| 99中文字幕在线| 欧美大电影免费观看| 一道本成人在线| 日本老熟妇毛茸茸| 久久xxx视频| 精品国产1区2区| 自慰无码一区二区三区| 18加网站在线| 一卡二卡三卡日韩欧美| 午夜精品电影在线观看| av在线女优影院| 亚洲色图视频免费播放| 精品免费久久久久久久| 大黄网站在线观看| 欧美日韩在线影院| www日韩在线观看| 久久久久伊人| 日韩午夜小视频| 国产一级伦理片| 欧美一区二区三| 超在线视频97| 香蕉免费毛片视频| 免费看日韩精品| 91成人理论电影| 五月天婷婷在线观看| 亚洲国产高清在线观看视频| 中文字幕成人一区| 欧美xxxx少妇| 在线一区二区三区四区五区| 亚洲一二区在线观看| 美女扒开腿让男人桶爽久久动漫| 日韩视频在线一区二区| 亚洲成人av免费在线观看| 亚洲91网站| 精品无码久久久久久国产| 国产精品酒店视频| 在线精品亚洲| 国产精品视频一区二区高潮| 成人免费一区二区三区| 国产激情一区二区三区| 欧美黄色直播| 在线观看的网站你懂的| 在线日韩av片| 欧美性生交xxxxx| 欧美一级本道电影免费专区| 欧美精品久久久久a| 中文字幕av久久爽| 97aⅴ精品视频一二三区| 精品一区二区久久久久久久网站| 老牛影视av牛牛影视av| 欧美韩国日本一区| 久久久久99精品成人片| 四虎永久精品在线| 日韩国产精品亚洲а∨天堂免| 精品久久久久久中文字幕人妻最新| 人人精品视频| 久久国产视频网站| 人妻中文字幕一区二区三区| 日韩不卡一二三区| 国产成人精品优优av| 亚洲免费国产视频| ...中文天堂在线一区| 久久综合久久色| 另类一区二区| 日韩视频国产视频| 免费黄色激情视频| 免费在线成人网| 1区1区3区4区产品乱码芒果精品| 成人免费观看在线视频| 中文字幕一区二区三区不卡在线| 国产小视频免费| 国产精品va视频| 日韩在线视频播放| 精人妻无码一区二区三区| xnxx国产精品| 妞干网在线观看视频| 日韩在线精品强乱中文字幕| www.日韩免费| a片在线免费观看| 久久一留热品黄| aⅴ在线免费观看| 日韩黄色网络| 日本高清视频一区| 免费av在线电影| 日韩欧美999| 午夜激情视频网| 国产精品伦理久久久久久| 国产精品久久久久久av| youjizz在线播放| 在线免费一区三区| 国产黄色录像视频| 在线亚洲自拍| 国产一区二区丝袜高跟鞋图片| 成人久久精品人妻一区二区三区| 久久久久九九视频| 黄色网在线视频| 国产精品极品| 91成人在线视频| 日本人妖在线| 在线免费一区三区| 国产在线观看免费视频软件| 国产一区二区导航在线播放| 97精品视频在线播放| 欧美熟女一区二区| 欧美日韩国产一区在线| 亚洲一区二区三区四区精品| 欧美va天堂在线| 国产精品一区二区三区四区五区 | 欧美激情三区| 日韩在线观看av| 国产黄色小视频在线观看| 亚洲五月六月丁香激情| 最近中文字幕无免费| 久久久久.com| 亚洲综合激情五月| 国产成人福利av| 日本一区二区不卡| 欧美一区二区三区激情| 欧美日韩性视频| 蜜桃av免费在线观看| 国产精品一区二区果冻传媒| 一区二区不卡在线| 色妞ww精品视频7777| 91黑丝高跟在线| 999国产在线视频| 欧美在线观看视频在线| 精品人妻互换一区二区三区| 日韩一区二区免费看| 亚洲黄色成人久久久| 国产黄色精品| 欧美激情一区二区三级高清视频 | 国产乱码精品一区二区三区av| 天天久久人人| 97品白浆高清久久久久久| 免费91麻豆精品国产自产在线观看| 亚洲图片欧美在线| 亚洲国产精品久久不卡毛片| b站大片免费直播| 日本午夜一本久久久综合| 性生活免费观看视频| 天海翼精品一区二区三区| 成人精品福利视频| 大胆人体一区| 欧美多人乱p欧美4p久久| 国产精品秘入口| 亚洲成人国产精品| 6—12呦国产精品| 日韩欧美在线视频观看| 麻豆亚洲av成人无码久久精品| 国产a久久麻豆| 天天爽夜夜爽一区二区三区| 99精品福利视频| 日本成人性视频| 久久不见久久见国语| 成人av网站观看| 久久久精品一区二区毛片免费看| 久久成人这里只有精品| 国产高清av在线| 亚洲精品国产欧美| www.日本在线观看| 欧美久久久久久久久| 青青草成人免费| 国产精品网曝门| 欧洲av一区二区三区| 99视频一区二区三区| 熟妇女人妻丰满少妇中文字幕| 国产综合网站| 一道本在线观看视频| 欧美精选视频在线观看| 精品一区久久久久久| swag国产精品一区二区| 亚洲自拍偷拍福利| www.久久热| 91精品在线看| 国产精品久一| 成人中心免费视频| 欧洲亚洲精品久久久久| 国产精品偷伦免费视频观看的| 香蕉久久aⅴ一区二区三区| 日韩精品黄色网| 天天操天天干天天舔| 欧美精品一区二区蜜臀亚洲| 亚洲国产999| 精品少妇一区二区三区在线播放 | 日韩亚洲欧美成人一区| 国产精品美女一区| 91精品午夜视频| 国产毛片久久久久| 日韩一区二区三区在线| 精品毛片在线观看| 日韩精品在线一区二区| 亚洲欧美高清视频| 亚洲精品一线二线三线无人区| 亚洲中文无码av在线| 欧美吞精做爰啪啪高潮| 在线播放成人av| 88在线观看91蜜桃国自产| 91精品国产乱码久久久久| 欧美性猛交xxxx乱大交蜜桃| 97人人澡人人爽人人模亚洲| 激情成人中文字幕| 丁香花五月激情| 亚洲一区二区在线免费观看视频 | 一区二区三区免费| 久久网中文字幕| 精品久久久国产| 国产精品久久久久久久久夜色| 亚洲va国产va欧美va观看| 任我爽在线视频| 国产日韩av一区| 在线观看美女av| 亚洲午夜羞羞片| 欧美 日韩 精品| 欧美日本视频在线| 亚洲国产成人在线观看| 日韩电影中文字幕在线观看| 亚洲国产www| 亚洲欧美日韩一区二区在线 | 一本一本久久a久久精品牛牛影视 一本色道久久综合亚洲精品小说 一本色道久久综合狠狠躁篇怎么玩 | 91免费在线看片| 伊人色综合久久天天人手人婷| 很污很黄的网站| 亚洲一区二区三区中文字幕在线| 欧美一区免费观看| 舔着乳尖日韩一区| 日韩精品国产一区二区| 在线看日本不卡| 国产激情久久久久久熟女老人av| 91精品国产一区二区三区蜜臀 | 日韩欧美在线综合网| 少妇性bbb搡bbb爽爽爽欧美| 亚洲国产天堂网精品网站| av大片在线观看| 久久久久成人精品| 欧美jizz18| 久草一区二区| 欧美~级网站不卡| av无码精品一区二区三区| 日韩国产高清在线| 中文字幕人妻无码系列第三区| 国产主播一区二区三区| 亚洲精品视频大全| 亚洲精品免费播放| 一区二区乱子伦在线播放| 亚洲国产精品va| а√天堂官网中文在线| 国产成人精品免高潮在线观看 | 欧美精品18+| 色综合成人av| 久久免费精品视频| av日韩一区| 日韩av电影免费播放| 亚洲三级精品| www.射射射| 国产乱一区二区| 激情五月深爱五月| 日韩欧美亚洲一二三区| 亚洲视频在线免费播放| 亚洲摸下面视频| 国产精品蜜芽在线观看| 999精品视频一区二区三区| 黄色成人美女网站| 在线观看av的网址| 精品一区二区在线视频| 最近中文字幕在线mv视频在线 | 久久露脸国语精品国产91| 51精品久久久久久久蜜臀| 精品国产国产综合精品| 婷婷综合另类小说色区| wwwav在线播放| 久久久精品国产亚洲| 成人在线免费观看黄色| 91精品国产综合久久久久久丝袜 | 一个人看的www视频在线免费观看| 欧美一级黄色网| 国产精品videossex| 国产一二三区在线播放| 国产精品一区二区免费不卡 | 久久99精品视频一区97| 亚洲日日夜夜| 波多野结衣激情| 狠狠狠色丁香婷婷综合久久五月| 91porn在线| 亚洲一级片在线观看| 丁香六月天婷婷| 91精品成人久久| 日本中文字幕在线一区| 六月丁香激情网| 久久综合九色综合欧美亚洲| 国产精品久免费的黄网站| 国产丝袜一区二区| 激情开心成人网| 亚洲精品中文字幕在线| 精品亚洲成a人| 久草网站在线观看| 精品久久久久久综合日本欧美| www日韩tube| 国产欧美日韩视频| 国产精品亚洲人成在99www| 少妇性l交大片| 国产精品久久久久aaaa| 国产乱色精品成人免费视频| 国产亚洲激情在线| 狠狠久久综合| 日本高清xxxx| 91丝袜呻吟高潮美腿白嫩在线观看| 性色av无码久久一区二区三区| 日韩欧美在线观看| 成人在线免费电影| 欧美孕妇性xx| 成人6969www免费视频| 天天爽人人爽夜夜爽| 久久久久久综合| 一级黄色片视频| 欧美高清无遮挡| 亚洲精品进入| 中文字幕免费高清在线| 欧美高清一级片在线观看| 一本一道无码中文字幕精品热| 亚洲成avwww人| 丝袜美腿一区| 日本免费高清一区二区| 激情欧美一区二区三区在线观看| 成熟人妻av无码专区| 7777精品久久久大香线蕉| xxxx在线视频| 亚洲午夜激情| av激情综合网| 国产精品久久久久久久久毛片| 中文字幕亚洲无线码a| 在线日韩成人| 美女黄色片视频| 亚洲国产精品久久一线不卡| av中文资源在线| 久久国产精品一区二区三区| 精久久久久久久久久久| 国产成人在线免费视频| 日韩色av导航| 亚洲福利影视| 50路60路老熟妇啪啪| 夜夜精品视频一区二区| 在线视频三区| 欧美激情第六页| 国产.精品.日韩.另类.中文.在线.播放|