八、併發工具類之CyclicBarrier

CyclicBarrier

CyclicBarrier和CountDownLatch功能相似。CyclicBarrier是所有參與線程互相等待對方執行到某點,再一起執行後面程序。

與CountDownLatch一樣,CyclicBarrier的構造函數也需要一個int類型的參數 parties,表示參與者數量。每一個線程調用cyclicBarrier對象的await方法就會進入等待。直到參與線程數量到達parties時,喚醒所有線程。

場景:所有參與者進入等待,在執行


 final CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
        for(int i=0 ;i<5;i++){
            final int c=i;
            new Thread(){
                @Override
                public void run() {
                    try {
                        System.out.println(String.format("參與者%d等待",c));
                        cyclicBarrier.await();
                        System.out.println(String.format("參與者%d執行",c));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }.start();
 }

執行結果

參與者3等待
參與者1等待
參與者2等待
參與者4等待
參與者0等待
參與者3執行
參與者0執行
參與者1執行
參與者2執行
參與者4執行

CyclicBarrier和CountDownLatch的區別

  1. CyclicBarrier內部用條件變量Condition實現,會產生上下文切換。CountDownLatch使用樂觀鎖實現。
  2. CyclicBarrier當parties=0時,在喚醒所有線程同時,還會重置parties。 CountDownLatch不能重置回滾。

CyclicBarrier使用場景

  1. 迭代算法併發化。迭代中,由多個工作線程完成工作。使用await等待所有工作線程完成工作,再將結果作爲下一輪迭代的輸入。

  2. 模擬高併發。保證線程同時開始其操作來模擬高併發測試。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章