同期コンテナ
ベクトルとArayList:
リストArrayListのが最も一般的な実装クラスで、内部は高速なランダムアクセスを可能要素のアレイによって達成されます。配列のサイズは、ストレージ容量を増やす必要性を満たさない場合、配列は各要素の間にスペースを持つことができないということです、話すことが必要である欠点は、データ・ストレージ・スペースの新しい配列にコピーされています。ArrayListの中間位置から要素を挿入または削除する場合、アレイは、移動をコピーする必要があり、コストが比較的高いです。したがって、それは、挿入や削除のために適しランダム探索とトラバーサルには適していません。
ベクターおよびArrayListのように、それは同期のスレッドをサポートすることを除いて、配列によって達成される時に1つだけのスレッドが、ベクタを書く引き起こした矛盾を書きながら、マルチスレッドを避けるが、同期は非常に高いコストを必要とすることができますしたがって、アクセス、アクセスのArrayListよりも遅くなります。ベクターおよびArrayListの拡大がベクトル能力を倍増するために、デフォルトの展開で、同じではありません、ArrayListの50%の容量の増加
注意:ベクトルスレッドセーフ、ArrayListを
Vector.add出典:
ArrayList.add出典:
したがって、それが見られ、Vectory方法は、スレッド同期書き込ま同期同期機能メソッドを使用します。
HashMapの和ハッシュテーブル:
スレッドセーフではない1.HashMap、HastMapサブインターフェースは、オブジェクトはキーと値がオブジェクトであり、重複キーを含めることはできませんが、重複値を含んでいてもよく、キー値にマッピングされ、インターフェース・マップ・インターフェースです。HashMapのがnullキーやnull値を許容し、ハッシュテーブルが許可されていません。
2.HashTableコレクションは、スレッドセーフです。
3.HashMapハッシュテーブルは、軽量を実現(非スレッドセーフな実装)である、彼らはMapインタフェースを完了している、主な違いは、HashMapのは、非スレッドセーフのために(キー)はnull(ヌル)キーを、可能にする、効率がより高くなるかもしれないということですハッシュテーブル。
HashMapのは、キー入力または値としてnullを許容し、Hashtableの許可されていません。
HashMapのハッシュテーブルは、削除メソッドが含まれているのcontainsValueのcontainsKeyを置き換えます。
注:ハッシュテーブルスレッドセーフ、HashMapのスレッドセーフ。この方法は、実装された同期方法を使用しても同期ハッシュテーブルのソースを入れて
synchronizedMap
同期ブロックを使用したソースコードは、スレッドセーフなコレクションの量は、スレッドセーフなコレクションとなって
例:Collections.synchronizedMap(HashMapの)、HashMapのスレッドの同期となります
ConcurrentHashMapの
ConcurrentMapインターフェイスの下に2つの重要な実現があります。
- ConcurrentHashMapの
- ConcurrentSkipListMapの(同時ソートをサポートしています。ConcurrentHas HMA pをメイクアップ)
ConcurrentHashMapの内部で使用するセグメント(セグメント)は、これらの異なるセクションを表すために、各セクションは、彼らが彼ら自身のロックを持って、実際に小さなハッシュテーブルです。限り、複数の改変が、異なるセグメントで発生するように、それらが複雑にすることができます。全体このシーン重いスレッドロック粒度は、それによって溶液のロック競合を低減する低減さもある。16個のセグメント(セグメント。オペレーションを修正する、すなわち、最大16の同時スレッドに分割されている。コードと共有変数のほとんど目的は、コンテンツの変更に初めてアクセスされ、パフォーマンスが非常に良いですが、揮発性のキーワードステートメントを使用しています。(java8後、代わりにCASアルゴリズムを使用して、セグメントの概念を放棄しました)
ConcurrentHashMapのの方法が原因効率に明らかであるのsynchronizedMap
たCountDownLatch
機能的に類似のカウンタを使用して実施することができるパッケージの下に配置たCountDownLatchクラスjava.util.concurrentの、。たとえば、あなたがたCountDownLatchを達成するために、この機能を使用することができ、他に実行するために4つのタスクの完了後に実行することが待機し、タスクAがあります。
CyclicBarrierを
その後、初期化CyclicBarrierを数の規定、および待機中のスレッドの数を入力するために、コールCyclicBarrier.await()を計算します。スレッドの数がこの数に達した場合、待機状態へのすべてのスレッドが目を覚ますと続きます。
その名のようにCyclicBarrierを、すべてのスレッドが一緒にこの障害を渡すために一緒に得た後に、障害物として見ることができるように、を意味します。
CyclicBarrierをも初期のRunnableのパラメータで、CyclicBarrierを番号の後、このRunnableをタスクは、他のすべてのスレッドが目覚めされる前に実行されるように、到達しました。
セマフォ
セマフォは、ベースカウンティングセマフォです。それは、信号の複数のスレッドが返還のための彼らの適用後に行うためのライセンスを取得するために競争し、これに基づいて、しきい値を設定することができ、閾値を超えた後、スレッドは、信号がブロックされている許可の申請をします。セマフォオブジェクトは、データベース接続のプールとしてプールの一部、リソースのプール等を構築するために使用することができ、我々は、セマフォのカウントを作成することができる。1、ミューテックスと同様の機構として、の量も示すバイナリフラグと呼ばれ二つの相互に排他的な状態。これは次のように使用されます。
availablePermitsは、現在利用可能なリソースの数を取得するために機能します
wc.acquire(); //アプリケーション・リソース
wc.release(); //リリースリソース
例:
トイレは3つしかピットビットが、トイレに10人があり、どのようにしますか?トイレに最終的にそれぞれの人10〜10の数、およびトイレの第1まず、10としたとします。そして、必然的に1-3利用可能ピットビットが来た、よくトイレに行く、4番は誰か出ている場合には、誰もアウトかどうかを確認する必要がある、または待つ3人の前で来ました。同様に、第4-10はまた、人々のトイレを待っているで行くことに出てきた、そして誰がそれに行く必要がある人は、それは先着最初のルールを遵守することができるかどうか、品質を待つ必要があるかどうかに依存します。(RPM)