能夠在對中對元素進行配對和交換的線程的同步點。每一個線程將條目上的某個方法呈現給 exchange
方法,與夥伴線程進行匹配,而且在返回時接收其夥伴的對象。Exchanger 可能被視爲 SynchronousQueue
的雙向形式。java
換句話說Exchanger提供的是一個交換服務,容許原子性的交換兩個(多個)對象,但同時只有一對纔會成功。先看一個簡單的實例模型。node
在上面的模型中,咱們假定一個空的棧(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,從而達到了交換的目的。算法
算法描述就是下圖展現的內容。數據結構
JDK 5就是採用相似的思想實現的Exchanger。JDK 6之後爲了支持多線程多對象同時Exchanger了就進行了改造(爲了支持更好的併發),採用ConcurrentHashMap的思想,將Stack分割成不少的片斷(或者說插槽Slot),線程Id(Thread.getId())hash相同的落在同一個Slot上,這樣在默認32個Slot上就有很好的吞吐量。固然會根據機器CPU內核的數量有必定的優化,有興趣的能夠去了解下Exchanger的源碼。多線程
至於Exchanger的使用,在JDK文檔上有個例子,講述的是兩個線程交換數據緩衝區的例子(實際上仍然能夠認爲是生產者/消費者模型)。併發
Exchanger實現的是一種數據分片的思想,這在大數據狀況下將數據分紅必定的片斷而且多線程執行的狀況下有必定的使用價值。oop
最近一直推託工做忙,更新頻度愈來愈低了,好在如今的工做還有點我的時間,之後爭取多更新下吧,至少也要把這個專輯寫完。大數據