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

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

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

    xylz,imxylz

    關注后端架構、中間件、分布式和并發編程

       :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      111 隨筆 :: 10 文章 :: 2680 評論 :: 0 Trackbacks

    可以在對中對元素進行配對和交換的線程的同步點。每個線程將條目上的某個方法呈現給 exchange 方法,與伙伴線程進行匹配,并且在返回時接收其伙伴的對象。Exchanger 可能被視為 SynchronousQueue 的雙向形式。

    換句話說Exchanger提供的是一個交換服務,允許原子性的交換兩個(多個)對象,但同時只有一對才會成功。先看一個簡單的實例模型。

     

    Exchanger

    在上面的模型中,我們假定一個空的棧(Stack),棧頂(Top)當然是沒有元素的。同時我們假定一個數據結構Node,包含一個要交換的元素E和一個要填充的“洞”Node。這時線程T1攜帶節點node1進入棧(cas_push),當然這是CAS操作,這樣棧頂就不為空了。線程T2攜帶節點node2進入棧,發現棧里面已經有元素了node1,同時發現node1的hold(Node)為空,于是將自己(node2)填充到node1的hold中(cas_fill)。然后將元素node1從棧中彈出(cas_take)。這樣線程T1就得到了node1.hold.item也就是node2的元素e2,線程T2就得到了node1.item也就是e1,從而達到了交換的目的。

    算法描述就是下圖展示的內容。

    image

    JDK 5就是采用類似的思想實現的Exchanger。JDK 6以后為了支持多線程多對象同時Exchanger了就進行了改造(為了支持更好的并發),采用ConcurrentHashMap的思想,將Stack分割成很多的片段(或者說插槽Slot),線程Id(Thread.getId())hash相同的落在同一個Slot上,這樣在默認32個Slot上就有很好的吞吐量。當然會根據機器CPU內核的數量有一定的優化,有興趣的可以去了解下Exchanger的源碼。

    至于Exchanger的使用,在JDK文檔上有個例子,講述的是兩個線程交換數據緩沖區的例子(實際上仍然可以認為是生產者/消費者模型)。

    class FillAndEmpty {
       Exchanger
    <DataBuffer> exchanger = new Exchanger<DataBuffer>();
       DataBuffer initialEmptyBuffer
    =  a made-up type
       DataBuffer initialFullBuffer
    = 

      
    class FillingLoop implements Runnable {
        
    public void run() {
           DataBuffer currentBuffer
    = initialEmptyBuffer;
          
    try {
            
    while (currentBuffer != null) {
               addToBuffer(currentBuffer);
              
    if (currentBuffer.isFull())
                 currentBuffer
    = exchanger.exchange(currentBuffer);
             }
           }
    catch (InterruptedException ex) { handle }
         }
       }

      
    class EmptyingLoop implements Runnable {
        
    public void run() {
           DataBuffer currentBuffer
    = initialFullBuffer;
          
    try {
            
    while (currentBuffer != null) {
               takeFromBuffer(currentBuffer);
              
    if (currentBuffer.isEmpty())
                 currentBuffer
    = exchanger.exchange(currentBuffer);
             }
           }
    catch (InterruptedException ex) { handle }
         }
       }

      
    void start() {
        
    new Thread(new FillingLoop()).start();
        
    new Thread(new EmptyingLoop()).start();
       }
      }

     

    Exchanger實現的是一種數據分片的思想,這在大數據情況下將數據分成一定的片段并且多線程執行的情況下有一定的使用價值。

    最近一直推托工作忙,更新頻度越來越低了,好在現在的工作還有點個人時間,以后爭取多更新下吧,至少也要把這個專輯寫完。

     



    ©2009-2014 IMXYLZ |求賢若渴
    posted on 2010-11-22 22:31 imxylz 閱讀(7766) 評論(0)  編輯  收藏 所屬分類: Java Concurrency

    ©2009-2014 IMXYLZ
    主站蜘蛛池模板: 黄网站色成年片大免费高清| 亚洲精品国产av成拍色拍| 亚洲人成网址在线观看| 亚洲国产精品久久人人爱| 亚洲高清视频在线播放| 国产成人+综合亚洲+天堂| 日韩人妻无码精品久久免费一| 日韩中文无码有码免费视频 | 久久亚洲日韩看片无码| 两个人看www免费视频| 影音先锋在线免费观看| 久久精品国产精品亚洲蜜月| 亚洲成a∨人片在无码2023| 日韩一区二区三区免费体验| 国产亚洲漂亮白嫩美女在线| 亚洲精品国自产拍在线观看| 国产精品亚洲综合久久| 182tv免费视视频线路一二三| 亚洲永久无码3D动漫一区| 免费观看四虎精品成人| 日韩特黄特色大片免费视频| 免费国产va视频永久在线观看| 久久久亚洲精品蜜桃臀| 黄色网址大全免费| 国产性爱在线观看亚洲黄色一级片 | 亚洲第一网站免费视频| 国产做国产爱免费视频| 亚洲视频在线一区| 毛片a级毛片免费观看免下载| 麻豆亚洲av熟女国产一区二| 性做久久久久久免费观看| 亚洲乱码卡三乱码新区| 国产一精品一aⅴ一免费| 亚洲a∨国产av综合av下载| 波多野结衣在线免费视频| 久久亚洲私人国产精品| 久久综合给合久久国产免费| 亚洲综合小说另类图片动图| 久久久久国色AV免费看图片| 亚洲jizzjizz在线播放久| 最近中文字幕无免费视频|