Java併發之Exchanger(交換者)

2021-08-28 02:25:08 字數 1038 閱讀 5630

**

exchanger是乙個執行緒間提供資料交換功能的寫作工具,他提供了乙個同步點,在這個同步點,兩個執行緒可以交換彼此的資料。執行緒間通過呼叫excahange()方法交換資料,如果第乙個執行緒先到達同步點,執行exchange方法,那麼他會一直在同步點等待第二個執行緒到達同步點,第二個執行緒也執行exchange方法,這時兩個執行緒都到達同步點,可以交換彼此的資料。

使用:(1)建立乙個exchanger物件;

(2)在要交換(同步)資料的同步點呼叫excr.exchange( )方法

public

class exchangertest

catch(exception e)

}}).start();

new thread(new runnable()

catch(exception e)

}}).start();

}}

輸出結果:

a的視角: a、b流水是否一致:false

a錄入的是:銀行流水a b錄入的是:銀行流水b

b的視角: a、b流水是否一致:false

a錄入的是:銀行流水a b錄入的是:銀行流水b

可以看出,exchanger的「交換」更偏向於資料的同步與共享,而不是「你的給我,我的給你」這樣有來有回的交換,是「你知道乙個資訊,我知道另乙個訊息,我們彼此交換了資訊,那麼我們就都知道了兩個訊息」。如果不願意在同步點一直等待另乙個執行緒,那麼可以用設定等待時間的exchange方法:excr.exchange(v x, long timeout, timeunit unit)。

*注意:

exchanger交換資料是成對的交換;

exchanger可以看做雙向的同步佇列,乙個執行緒從個佇列頭部進行操作,乙個從個佇列尾部進行操作;

使用場景:

需要資料交換共享的場景,例如遺傳演算法中,需要選擇兩個人來交配,交換兩人的資料並根據交換規則來得到交配結果,再例如用於校對工作,交換兩個執行緒的資料,用於校對兩個執行緒的資料是否相等;

java併發之執行緒封閉

實現好的併發是一件困難的事情,所以很多時候我們都想躲避併發。避免併發最簡單的方法就是執行緒封閉。什麼是執行緒封閉呢?就是把物件封裝到乙個執行緒裡,只有這乙個執行緒能看到此物件。那麼這個物件就算不是執行緒安全的也不會出現任何安全問題。實現執行緒封閉有哪些方法呢?這是完全靠實現者控制的執行緒封閉,他的執...

Java併發之讀 寫鎖

讀取 沒有執行緒正在做寫操作且沒有執行緒請求寫操作 寫入 沒有執行緒正在做寫操作 這裡假設寫操作的優先順序比讀操作高 當乙個執行緒已經擁有寫鎖,才允許寫鎖重入 public class readwritelock writerequest writeaccesses writingthread ca...

java並發包之ConcurrentHashMap

1.hashentry類static final class hashentry 2.segment類static final class segmentextends reentrantlock implements serializable 設定 table 引用到這個新生成的 hashentr...