特定のケースに何を選択しますか? zaparkiとdeadline'ovの条件では、すべてのjava.util.concurrentをカバーするのはかなり困難です。 同様のものを選択して、行ってください! そのため、徐々にArrayBlockingQueue、ConcurrentHashMap、AtomicInteger、Collections.synchronizedList(新しいLinkedList())およびその他の興味深いものがコードに表示されます。 時には正しい、時にはそうではない。 ある時点で、Javaの標準クラスの95%以上が製品開発でまったく使用されていないことに気付き始めます。 コレクション、プリミティブ、ある場所から別の場所へのバイトの移動、休止状態、SpringまたはEJB、その他のライブラリ、そして出来事、アプリケーションの準備ができました。
少なくとも何らかの方法で知識を合理化し、トピックへの入力を容易にするために、マルチスレッドで作業するためのクラスの概要を以下に示します。 私は主に自分用のチートシートとして書いています。 そして、他の誰かが似合うなら、それは一般的に素晴らしいです。
種子用
すぐにいくつかの興味深いリンクを提供してください。 マルチスレッドで少し泳ぐ人のための最初の。 「高度な」プログラマーのための2番目-ここに何か役に立つかもしれません。
java.util.concurrentパッケージの作成者について少し
誰かがjava.util.concurrentクラスのソースコードを開いた場合、著者のDoug Lea(ダグリー)、Oswego教授(Osuigo)、ニューヨーク大学に気づかずにはいられませんでした。 彼の最も有名な開発のリストには、Java コレクションとutil.concurrentが含まれており、それらは何らかの形で既存のJDKに反映されていました。 また、動的なメモリ割り当てのためのdlmalloc実装も作成しました。 文献の中には、Javaでのマルチスレッドコンカレントプログラミングに関する本:Design Principles and Pattern、2nd Editionがありました 。 詳細については、彼のホームページをご覧ください 。

2010年のJVM Language SummitでのDoug Leaのパフォーマンス。
トップへ
おそらく、多くの人がjava.util.concurrentを見ると混乱を感じていました。 1つのパッケージに、完全に異なる機能を持つ異なるクラスが混在しているため、関連するものとその動作を理解するのが多少難しくなります。 したがって、機能属性に応じてクラスとインターフェースを概略的に分割し、特定の部分の実装を検討できます。

同時コレクション -java.utilパッケージの標準のユニバーサルコレクションよりも、マルチスレッド環境でより効率的に動作するコレクションのコレクション。 コレクション全体へのアクセスをブロックするベースラッパーのCollections.synchronizedListの代わりに、データセグメントのロックが使用されるか、 待機なしのアルゴリズムを使用したデータの並列読み取り用に作業が最適化されます。
キュー -マルチスレッドをサポートする非ブロッキングおよびブロッキングキュー。 ノンブロッキングキューは、スレッドをブロックせずに速度と動作を向上させるために強化されています。 ブロッキングキューは、プロデューサースレッドまたはコンシューマスレッドを「スローダウン」する必要がある場合、たとえばキューが空またはブランド変更された場合、または無料のコンシューマがない場合など、条件が満たされない場合に使用されます。
Synchronizers-スレッド同期のためのヘルパーユーティリティ。 それらは「並列」コンピューティングの強力な武器です。
エグゼキューター -スレッドプールを作成し、結果を取得して非同期タスクをスケジュールするための優れたフレームワークが含まれています。
ロック -基本的なsynchronized、wait、notify、notifyAllと比較して、フローの同期の代替のより柔軟なメカニズムを表します。
アトミック -プリミティブおよびリンクのアトミック操作をサポートするクラス。
1.コンカレントコレクション
CopyOnWriteコレクション

名前はそれ自体を物語っています。 コレクションを変更するすべての操作(追加、設定、削除)により、内部アレイの新しいコピーが作成されます。 これにより、コレクションを反復処理するときにConcurrentModificationExceptionがスローされなくなります。 配列をコピーする場合、オブジェクトへの参照(リンク)(浅いコピー)のみがコピーされることに注意してください。 要素フィールドへのアクセスはスレッドセーフではありません。 CopyOnWriteコレクションは、書き込み操作が非常にまれな場合、たとえば、リスナーサブスクリプションメカニズムを実装してそれらを通過する場合に使用すると便利です。
CopyOnWriteArrayList <E>


追加のメソッドとコンストラクター
CopyOnWriteArrayList(E [] toCopyIn) | 入力として配列を受け取るコンストラクター。 |
int indexOf(E e、int index) | 指定されたインデックスから検索を開始し、最初に見つかった要素のインデックスを返します。 |
int lastIndexOf(E e、int index) | 指定されたインデックスから開始して、逆検索で見つかった最初の要素のインデックスを返します。 |
boolean addIfAbsent(E e) | コレクションにないアイテムを追加します。 equalsメソッドは、要素を比較するために使用されます。 |
int addAllAbsent(コレクション<?extends E> c) | コレクションにないアイテムを追加します。 追加されたアイテムの数を返します。 |
CopyOnWriteArraySet <E>


スケーラブルなマップ

HashMap、TreeMapの実装が改善され、マルチスレッドとスケーラビリティのサポートが改善されました。
ConcurrentMap <K、V>


追加の方法
V putIfAbsent(Kキー、V値) | キーがコレクションにない場合にのみ、新しいキーと値のペアを追加します。 指定されたキーの以前の値を返します。 |
boolean remove(オブジェクトキー、オブジェクト値) | 指定されたキーがMapの指定された値と一致する場合にのみ、キーと値のペアを削除します。 アイテムが正常に削除された場合、trueを返します。 |
ブール置換(Kキー、V oldValue、V newValue) | 古い値がMapで指定された値と一致する場合にのみ、キーで古い値を新しい値に置き換えます。 値が新しい値に置き換えられた場合、trueを返します。 |
V置換(Kキー、V値) | キーがいずれかの値に関連付けられている場合にのみ、キーによって古い値を新しい値に置き換えます。 指定されたキーの以前の値を返します。 |
ConcurrentHashMap <K、V>


追加のコンストラクタ
ConcurrentHashMap(int initialCapacity、float loadFactor、int concurrencyLevel) | コンストラクターの3番目のパラメーターは、同時に書き込むスレッドの予想数です。 デフォルト値は16です。メモリ内のコレクションのサイズとパフォーマンスに影響します。 |
ConcurrentNavigableMap <K、V>


ConcurrentSkipListMap <K、V>


ConcurrentSkipListSet <E>


2.キュー
ノンブロッキングキュー

リンクされたノードでのスレッドセーフでノンブロッキングのキュー実装。
ConcurrentLinkedQueue <E>


ConcurrentLinkedDeque <E>


ブロッキングキュー

BlockingQueue <E>


ArrayBlockingQueue <E>


DelayQueue <E extends Delayed>


LinkedBlockingQueue <E>


PriorityBlockingQueue <E>


SynchronousQueue <E>


BlockingDeque <E>


LinkedBlockingDeque <E>


TransferQueue <E>


LinkedTransferQueue <E>


3.シンクロナイザー

このセクションでは、スレッドをアクティブに管理するためのクラスを提供します。
セマフォ


CountDownLatch


CyclicBarrier


エクスチェンジャー<V>


フェイザー


4.エグゼキューター
それで、私たちはパッケージの大部分に到達しました。 ここでは、FutureインターフェイスとCallableインターフェイスを介して結果を取得する可能性がある非同期タスクを実行するためのインターフェイス、およびスレッドプールを作成するためのサービスとファクトリー、ThreadPoolExecutor、ScheduledPoolExecutor、ForkJoinPoolについて説明します。 理解を深めるために、インターフェイスとクラスを少し分解します。
未来と呼び出し可能

未来<v>


RunnableFuture <V>


呼び出し可能<V>


FutureTask <V>


遅れた


ScheduledFuture <V>


RunnableScheduledFuture <V>


エグゼキューターサービス

執行者


ExecutorService


ScheduledExecutorService


AbstractExecutorService



ThreadPoolExecutor&Factory

執行者



ThreadPoolExecutor


ScheduledThreadPoolExecutor


スレッドファクトリー


RejectedExecutionHandler


フォーク参加

Java 1.7では、 分割統治アルゴリズムまたはMap Reduceで動作する再帰タスクを解決するために、新しいFork Joinフレームワークが導入されました。 より明確にするために、クイックソートソートアルゴリズムの視覚的な例を示します。

そのため、パーツに分割することにより、異なるスレッドで並列処理を実現できます。 この問題を解決するには、通常のThreadPoolExecutorを使用できますが、コンテキストの頻繁な切り替えと実行制御の監視のため、これらはすべて効果的に機能しません。 これが、 ワークスティークアルゴリズムに基づいたFork Joinフレームワークの助けとなります。 多数のプロセッサを搭載したシステムで最もよく表れます。 詳細については、 こちらのブログまたはDoug Leaの出版物を ご覧ください 。 ここでパフォーマンスとスケーラビリティについて読むことができます 。
フォークジョインプール


ForkJoinTask



RecursiveTask



RecursiveAction



ForkJoinWorkerThread


完了サービス

CompletionService


ExecutorCompletionService


5.ロック

状態


ロックする


再入可能ロック


ReadWriteLock


ReentrantReadWriteLock


ReentrantReadWriteLock.ReadLock


ReentrantReadWriteLock.WriteLock


ロックサポート



AbstractOwnableSynchronizer


AbstractQueuedSynchronizer


AbstractQueuedLongSynchronizer


6.アトミック

AtomicBoolean、AtomicInteger、AtomicLong、AtomicIntegerArray、AtomicLongArray-


AtomicReference-


AtomicMarkableReference-


AtomicStampedReference-


AtomicReferenceArray-


AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater-


結論の代わりに
最後まで読んでいただき、ありがとうございます。少なくとも最後まで記事をスクロールしてください。ここでは例を挙げずにクラスの簡単な説明にすぎないことを強調したいだけです。これは、過剰なコード挿入で記事が乱雑にならないように特に行われます。主なアイデア:どの方向に移動し、何を使用できるかを知るために、クラスの概要を簡単に示します。クラスの使用例は、インターネットまたはクラス自体のソースコードで簡単に見つけることができます。この投稿が、マルチスレッドの興味深い問題を迅速かつ効率的に解決するのに役立つことを願っています。
