<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    xylz,imxylz

    關(guān)注后端架構(gòu)、中間件、分布式和并發(fā)編程

       :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      111 隨筆 :: 10 文章 :: 2680 評(píng)論 :: 0 Trackbacks

    這個(gè)小節(jié)介紹Queue的最后一個(gè)工具,也是最強(qiáng)大的一個(gè)工具。從名稱上就可以看到此工具的特點(diǎn):雙向并發(fā)阻塞隊(duì)列。所謂雙向是指可以從隊(duì)列的頭和尾同時(shí)操作,并發(fā)只是線程安全的實(shí)現(xiàn),阻塞允許在入隊(duì)出隊(duì)不滿足條件時(shí)掛起線程,這里說(shuō)的隊(duì)列是指支持FIFO/FILO實(shí)現(xiàn)的鏈表。

     

    首先看下LinkedBlockingDeque的數(shù)據(jù)結(jié)構(gòu)。通常情況下從數(shù)據(jù)結(jié)構(gòu)上就能看出這種實(shí)現(xiàn)的優(yōu)缺點(diǎn),這樣就知道如何更好的使用工具了。

    LinkedBlockingDeque類圖

    從數(shù)據(jù)結(jié)構(gòu)和功能需求上可以得到以下結(jié)論:

    1. 要想支持阻塞功能,隊(duì)列的容量一定是固定的,否則無(wú)法在入隊(duì)的時(shí)候掛起線程。也就是capacity是final類型的。
    2. 既然是雙向鏈表,每一個(gè)結(jié)點(diǎn)就需要前后兩個(gè)引用,這樣才能將所有元素串聯(lián)起來(lái),支持雙向遍歷。也即需要prev/next兩個(gè)引用。
    3. 雙向鏈表需要頭尾同時(shí)操作,所以需要first/last兩個(gè)節(jié)點(diǎn),當(dāng)然可以參考LinkedList那樣采用一個(gè)節(jié)點(diǎn)的雙向來(lái)完成,那樣實(shí)現(xiàn)起來(lái)就稍微麻煩點(diǎn)。
    4. 既然要支持阻塞功能,就需要鎖和條件變量來(lái)掛起線程。這里使用一個(gè)鎖兩個(gè)條件變量來(lái)完成此功能。

     

    有了上面的結(jié)論再來(lái)研究LinkedBlockingDeque的優(yōu)缺點(diǎn)。

    優(yōu)點(diǎn)當(dāng)然是功能足夠強(qiáng)大,同時(shí)由于采用一個(gè)獨(dú)占鎖,因此實(shí)現(xiàn)起來(lái)也比較簡(jiǎn)單。所有對(duì)隊(duì)列的操作都加鎖就可以完成。同時(shí)獨(dú)占鎖也能夠很好的支持雙向阻塞的特性。

    凡事有利必有弊。缺點(diǎn)就是由于獨(dú)占鎖,所以不能同時(shí)進(jìn)行兩個(gè)操作,這樣性能上就大打折扣。從性能的角度講LinkedBlockingDeque要比LinkedBlockingQueue要低很多,比CocurrentLinkedQueue就低更多了,這在高并發(fā)情況下就比較明顯了。

    前面分析足夠多的Queue實(shí)現(xiàn)后,LinkedBlockingDeque的原理和實(shí)現(xiàn)就不值得一提了,無(wú)非是在獨(dú)占鎖下對(duì)一個(gè)鏈表的普通操作。

    有趣的是此類支持序列化,但是Node并不支持序列化,因此fist/last就不能序列化,那么如何完成序列化/反序列化過(guò)程呢?

    清單1 LinkedBlockingDeque的序列化、反序列化

    private void writeObject(java.io.ObjectOutputStream s)
        throws java.io.IOException {
        lock.lock();
        try {
            // Write out capacity and any hidden stuff
            s.defaultWriteObject();
            // Write out all elements in the proper order.
            for (Node<E> p = first; p != null; p = p.next)
                s.writeObject(p.item);
            // Use trailing null as sentinel
            s.writeObject(null);
        } finally {
            lock.unlock();
        }
    }

    private void readObject(java.io.ObjectInputStream s)
        throws java.io.IOException, ClassNotFoundException {
        s.defaultReadObject();
        count = 0;
        first = null;
        last = null;
        // Read in all elements and place in queue
        for (;;) {
            E item = (E)s.readObject();
            if (item == null)
                break;
            add(item);
        }
    }

     

    清單1 描述的是LinkedBlockingDeque序列化/反序列化的過(guò)程。序列化時(shí)將真正的元素寫(xiě)入輸出流,最后還寫(xiě)入了一個(gè)null。讀取的時(shí)候?qū)⑺袑?duì)象列表讀出來(lái),如果讀取到一個(gè)null就表示結(jié)束。這就是為什么寫(xiě)入的時(shí)候?qū)懭胍粋€(gè)null的原因,因?yàn)闆](méi)有將count寫(xiě)入流,所以就靠null來(lái)表示結(jié)束,省一個(gè)整數(shù)空間。

     



    ©2009-2014 IMXYLZ |求賢若渴
    posted on 2010-08-18 16:01 imxylz 閱讀(9756) 評(píng)論(5)  編輯  收藏 所屬分類: Java Concurrency

    評(píng)論

    # re: 深入淺出 Java Concurrency (25): 并發(fā)容器 part 10 雙向并發(fā)阻塞隊(duì)列 BlockingDeque[未登錄](méi) 2010-08-19 16:25 行云流水
    樓主走神了,這么久來(lái)更新一次。哈哈  回復(fù)  更多評(píng)論
      

    # re: 深入淺出 Java Concurrency (25): 并發(fā)容器 part 10 雙向并發(fā)阻塞隊(duì)列 BlockingDeque[未登錄](méi) 2010-11-16 16:38 蟲(chóng)蟲(chóng)
    樓主怎么不繼續(xù)拉,想看啊~  回復(fù)  更多評(píng)論
      

    # re: 深入淺出 Java Concurrency (25): 并發(fā)容器 part 10 雙向并發(fā)阻塞隊(duì)列 BlockingDeque 2011-02-15 10:46 hixiaomin
    最底部導(dǎo)航有些小問(wèn)題,哈哈。  回復(fù)  更多評(píng)論
      

    # re: 深入淺出 Java Concurrency (25): 并發(fā)容器 part 10 雙向并發(fā)阻塞隊(duì)列 BlockingDeque 2011-02-15 10:51 xylz
    @hixiaomin
    你真仔細(xì),贊!  回復(fù)  更多評(píng)論
      

    # re: 深入淺出 Java Concurrency (25): 并發(fā)容器 part 10 雙向并發(fā)阻塞隊(duì)列 BlockingDeque[未登錄](méi) 2016-04-22 15:19
    Mark,今天看到這里啦,滿滿的成就感。。。。。嘿嘿  回復(fù)  更多評(píng)論
      


    ©2009-2014 IMXYLZ
    主站蜘蛛池模板: 亚洲国产成人久久99精品| 四虎在线播放免费永久视频| 无码av免费一区二区三区| 国产视频精品免费视频| 一级做α爱过程免费视频| 人人爽人人爽人人片av免费| 乱人伦中文视频在线观看免费| 西西人体大胆免费视频| 水蜜桃视频在线观看免费| 一日本道a高清免费播放| 两性色午夜免费视频| 国产99视频精品免费专区| 日本一道本不卡免费| 蜜臀AV免费一区二区三区| 永久免费毛片在线播放| 免费观看毛片视频| 全部免费毛片在线| 国产亚洲色婷婷久久99精品91| 亚洲AV永久无码精品| 亚洲成电影在线观看青青| 国产91在线|亚洲| 亚洲av综合av一区二区三区| 免费的黄色的网站| baoyu777永久免费视频| 足恋玩丝袜脚视频免费网站| 永久免费毛片在线播放| 亚洲成A∨人片天堂网无码| 中文亚洲AV片在线观看不卡| 亚洲综合一区二区国产精品| 美女视频黄免费亚洲| 美女羞羞视频免费网站| 你懂的免费在线观看| 18禁美女黄网站色大片免费观看 | 久久久久亚洲精品无码网址色欲| 日韩电影免费在线观看网址| 在线观看免费无码专区| 免费无码又爽又刺激聊天APP| 亚洲精品老司机在线观看| 亚洲国产美国国产综合一区二区 | 久久久亚洲欧洲日产国码农村| 亚洲第一区视频在线观看|