Java為我們提供了三個同步工具類:

  • CountDownLatch(閉鎖)
  • CyclicBarrier(柵欄)
  • Semaphore(信號量)

這幾個工具類其實説白了就是為了能夠更好控制線程之間的通訊問題。

一、CountDownLatch

1.1CountDownLatch簡介

CountDownLatch是一個同步的輔助類,允許一個或多個線程一直等待,直到其它線程完成它們的操作。

它常用的API其實就兩個:await()和countDown()。

使用説明:

  • count初始化CountDownLatch,然後需要等待的線程調用await方法。await方法會一直受阻塞直到count=0。而其它線程完成自己的操作後,調用countDown()使計數器count減1。當count減到0時,所有在等待的線程均會被釋放
  • 説白了就是通過count變量來控制等待,如果count值為0了(其他線程的任務都完成了),那就可以繼續執行。

二、CyclicBarrier

簡單來説:CyclicBarrier允許一組線程互相等待,直到到達某個公共屏障點。叫做cyclic是因為當所有等待線程都被釋放以後,CyclicBarrier可以被重用(對比於CountDownLatch是不能重用的)

使用説明:

  • CountDownLatch注重的是等待其他線程完成,CyclicBarrier注重的是:當線程到達某個狀態後,暫停下來等待其他線程,所有線程均到達以後,繼續執行。

三、Semaphore

Semaphore(信號量)實際上就是可以控制同時訪問的線程個數,它維護了一組"許可證"。

  • 當調用acquire()方法時,會消費一個許可證。如果沒有許可證了,會阻塞起來
  • 當調用release()方法時,會添加一個許可證。
  • 這些"許可證"的個數其實就是一個count變量罷了

四、總結

Java為我們提供了三個同步工具類:

  • CountDownLatch(閉鎖)

– 某個線程等待其他線程執行完畢後,它才執行(其他線程等待某個線程執行完畢後,它才執行)

  • CyclicBarrier(柵欄)

– 一組線程互相等待至某個狀態,這組線程再同時執行。

  • Semaphore(信號量)

– 控制一組線程同時執行。

本文簡單的介紹了一下這三個同步工具類是幹嘛用的,要深入還得看源碼或者借鑑其他的資料。

趙客縵胡纓,吳鈎霜雪明。