高同時プログラミングシリーズ:4大同時ツールクラスの機能、原理、および応用シーン


通常、私たちが言っているのはjavaです.util.concurrentは、Javaコンカレントツールクラスやコンカレントコンテナなどを集めていますが、今日は主にJavaコンカレントプログラミングのツールクラスを紹介します.まずJavaコンカレントツールパッケージからお話しします.
01

コンカレントキットの範囲
1.同時ツールクラス
CountDownLatch、CyclicBarrier、Semaphoreなど、synchronizedよりも高度なさまざまな同期構造を提供し、より豊富なマルチスレッド操作を実現できます.
2.同時コンテナ
最も一般的なConcurrentHashMap、ConcurrentSkipListMap、スレッドセキュリティを実現する動的配列CopyOnWriteArrayListなど、さまざまなスレッドセキュリティのコンテナを提供します.
3.同時キュー
各種BlockingQueueの実現:よく使われるArrayBlockingQueue、SynchorousQueue、特定シーンのPriorityBlockingQueue.
4.Executorフレームワーク
さまざまなタイプのスレッドプールを作成したり、タスクの実行をスケジュールしたりすることができます.ほとんどの場合、スレッドプールとタスクスケジューラを最初から実装する必要はありません.
 
 
02

共通のコンカレントコンテナ
1.ConcurrentHashMap
よく使われるコンカレントコンテナは、JDK 1.7と1.8の下位データ構造が変化しています(後述します).ここでは、Java 7 HashMap->Java 7 ConcurrentHashMap->Java 8 HashMap->Java 8 ConcurrentHashMapから、このコンカレントコンテナをよりよく把握することができます.結局、HashMapから進化したものです.
2.ConcurrentSkipListMap
順序を気にして、データを頻繁に修正する必要があります.
3.CopyOnWrite容器
CopyOnWriteコンテナは、書き込み時にコピーされたコンテナです.JDK 1から5 Javaを開始し,CopyOnWriteメカニズムを用いて実現される2つの同時コンテナ,CopyOnWriteArrayList,CopyOnWriteArraySetを発注した.
4.各種同時キューの実現
様々なBlockedQueue実装のように、典型的なArrayBlockingQueue、SynchorousQueueを比較する.
 
 
03

共通のコンカレントツールクラス
1.CountDownLatch
機能:
CountDownLatchは同期の補助クラスであり、1つ以上のスレッドを許可し、他のスレッドのセットが操作を完了するのを待ってから実行を続行します.
原理:
  • CountDownLatchは、カウンタの初期値が待機スレッドを必要とする数であるカウンタによって実現される.

  • eg:CountDownLatch c = new CountDownLatch(10);//スレッド待ちの数は10
  • プライマリ・スレッドCountDownLatchを呼び出すawait()メソッドは、カウンタの値が0になるまで、現在のスレッド(すなわち、プライマリ・スレッドがロックで待機する)をブロックします.
  • ワークスレッドが自分のタスクを完了すると、CountDownLatchのcountDown()メソッドが呼び出され、カウンタの値が1減少します.
  • カウンタ値が0の場合、すべての作業スレッドが完了したことを示します.この場合、ロックで待機しているメインスレッドは、実行タスクを再開できます. 

  • 適用シーン:
    カウントダウンタイマ
    例えば、典型的なシーンはロケット発射です.ロケットが打ち上げられる前に、万全を期すために、各設備、機器の検査を行うことが多い.すべての検査が終わってから、エンジンに火をつけることができます.このシーンはCountDownLatchを使用するのに適しています.
    点火スレッドを作成し、すべての検査スレッドが完了してから実行できます.
    使用方法:
    static final CountDownLatch end = new CountDownLatch(10);end.countDown();  end.await();
    2.CyclicBarrier
    機能:
    CyclicBarrierの文字通り、リサイクル可能なバリア(Barrier)を意味する.これは、スレッドのセットがバリア(同期ポイントとも呼ばれる)に到達するとブロックされ、最後のスレッドがバリアに到達するまでバリアが開き、バリアによってブロックされたすべてのスレッドが動作し続けることです.
    CountDownLatchと似ていて、一部のスレッドが完了してから実行するのを待っています.
    CountDownLatchと区別:
    このカウンターは繰り返し使用可能です.たとえば、カウンタを10に設定します.では、最初のスレッド1 0個を揃えると、カウンタはゼロに戻り、次のスレッド10個を揃える.
    原理:
    1)CyclicBarrierは1つのカウンタによって実現され,カウンタの初期値は待機スレッドの数である.eg:CyclicBarrier c = new CyclicBarrier(2);//待機スレッド数2
    2)各スレッドはCyclicBarrierのawait()メソッドを呼び出し,自分を待機状態にする.
    3)すべてのスレッドがCyclicBarrierのawait()メソッドを呼び出した後,すべてのスレッドは待機を停止し,実行を継続する.
    使用方法:
    public CyclicBarrier(int parties, Runnable barrierAction) 
    barrierAction , await()

    3.信号量Semaphore
    機能:
    Javaは、一定数のライセンス(permit)を制御することによって、汎用リソースへのアクセスを制限する目的を達成する古典的な信号量Semaphoreの実装を提供します.たとえば、同時スレッド数を制御します.
    原理:
    1)Semaphoreは1つのカウンタ(レコードライセンスの数)によって実現され,カウンタの初期値は待機スレッドが必要な数である.
    eg:Semaphore s = new Semaphore(10);//スレッドの最大同時数は10
    2)スレッドはacquire()メソッドでライセンスを取得し(カウンタの値は1を減らします)、ライセンスを取得してから実行を続けることができます.そうしないと、現在のスレッドがブロックされます.
    3)スレッドはrelease()メソッドでライセンスを返却する(カウンタの値に1を加算).
    説明:tryAcquire()メソッドを使用すると、すぐに実行結果が得られます.ライセンスを取得しようとしますが、取得に成功するとtrueが返され、取得に失敗するとfalseが返されます.
    適用シーン:
    Semaphoreは、トラフィック制御、特に共通リソースの限られたアプリケーションシーン、例えばデータベース接続に使用できます.
    例えば、駅や空港でタクシーを待っているとき、多くの空いているタクシーが着席したとき、混雑を防ぐために、スケジューラが並んで待っている列を指揮して一度に5人が乗車し、5人が車に乗って出発するのを待ってから、次のグループに入れます.これはSemaphoreの動作原理と少し似ています.
    4.交換者Exchanger
    機能:
    Exchanger(エクスチェンジ)は、スレッド間のコラボレーションのためのツールクラスです.Exchangerはスレッド間のデータ交換に使用します.
    原理:
    2つのスレッドが互いにデータを交換できる同期ポイントを提供します.
    この2つのスレッドはexchangeメソッドでデータを交換し、最初のスレッドが先にexchangeメソッドを実行すると、2番目のスレッドもexchangeを実行するのをずっと待っています.2つのスレッドが同期点に達すると、この2つのスレッドはデータを交換し、このスレッドで生成されたデータを相手に渡すことができます.
    Exchangerの適用シーン
    Exchangerは、仕事のシーンを校正するために使用できます.