Java並行・並列・非同期処理チートシート

## スレッド制御
| クラス / _インタフェース_ / メソッド | 概要 | Since |
|:------------------|:----|:-----:|
| java.lang.Thread | 明示的なスレッド制御 | 1.0 |
| _java.lang.Runnable_ | 非同期タスク | 1.0 |
| java.lang.Thread#sleep | スレッド休眠処理 | 1.0 |
| java.lang.Thread#yield | スレッド一時休眠のヒント | 1.0 |
| java.lang.Thread#onSpinWait | Spin-Waitループのヒント | 1.9 |
Java 1.5以降では **Executorsフレームワーク** 利用を優先検討のこと。


## 遅延実行（タイマー）
| クラス / メソッド | 概要 | Since |
|:------------------|:----|:-----:|
| java.util.TimerTask | 遅延実行タスク | 1.3 |
| java.util.Timer#schedule | 遅延タスクの実行予約 | 1.3 |
| java.util.Timer#scheduleAtFixedRate | 遅延タスクの周期実行予約 | 1.3 |
Java 1.5以降では **Executorsフレームワーク** 利用を優先検討のこと。


## モニター同期
| メソッド / 構文 | 概要 | Since |
|:------------------|:----|:-----:|
| java.lang.Object#wait | モニター待機 | 1.0 |
| java.lang.Object#notify | モニター通知/Signal | 1.0 |
| java.lang.Object#notifyAll | モニター通知/Broadcast | 1.0 |
| synchronizedブロック構文 | スコープベースのモニターロック | 1.0 |
モニター待機／通知処理の代わりに、Java 1.5以降では **java.util.concurrentパッケージ** （以下j.u.c表記）利用を優先検討のこと。


## スレッドセーフ・コンテナ
| メソッド | 概要 | Since |
|:--------|:----|:-----:|
| java.util.Vector | スレッドセーフ可変長配列 | 1.0 |
| java.util.Collections#synchronizedCollection | スレッドセーフCollectionへの変換 | 1.2 |
| java.util.Collections#synchronizedList | スレッドセーフListへの変換 | 1.2 |
| java.util.Collections#synchronizedSet | スレッドセーフSetへの変換 | 1.2 |
| java.util.Collections#synchronizedMap | スレッドセーフMapへの変換 | 1.2 |
| java.util.Collections#synchronizedSortedSet | スレッドセーフSortedSetへの変換 | 1.2 |
| java.util.Collections#synchronizedSortedMap | スレッドセーフSortedMapへの変換 | 1.2 |
| java.util.Collections#synchronizedNavigableSet | スレッドセーフNavigableSetへの変換 | 1.8 |
| java.util.Collections#synchronizedNavigableMap | スレッドセーフNavigableMapへの変換 | 1.8 |
java.util.Collections#synchronizedXxxメソッドは、モニターロック実装によるスレッドセーフ・コンテナのインスタンスを返す。


## 並行コンテナ
| クラス | 概要 | Since |
|:------|:----|:-----:|
| j.u.c.ConcurrentLinkedQueue | FIFO, ノンブロック/任意上限 | 1.5 |
| j.u.c.ArrayBlockingQueue | FIFO, ブロッキング/上限付き | 1.5 |
| j.u.c.LinkedBlockingQueue | FIFO, ブロッキング/任意上限 | 1.5 |
| j.u.c.DelayQueue | FIFO, ブロッキング/上限なし/遅延指定 | 1.5 |
| j.u.c.PriorityBlockingQueue | 優先度付きFIFO, ブロッキング/上限なし | 1.5 |
| j.u.c.LinkedBlockingDeque | LIFO, ブロッキング/任意上限 | 1.6 |
| j.u.c.LinkedTransferQueue | FIFO, 同期転送 or ノンブロック/上限なし | 1.7 |
| j.u.c.ConcurrentHashMap | 並行ハッシュテーブル実装によるMap | 1.5 |
| j.u.c.ConcurrentSkipListMap | 並行スキップリスト実装によるスレッドセーフMap | 1.6 |
| j.u.c.ConcurrentSkipListSet | 並行スキップリスト実装によるスレッドセーフSet | 1.6 |
| j.u.c.CopyOnWriteArrayList | Copy-on-Write実装によるスレッドセーフList | 1.6 |
| j.u.c.CopyOnWriteArraySet | Copy-on-Write実装によるスレッドセーフSet | 1.6 |


## 同期プリミティブ
| クラス / _インタフェース_ | 概要 | Since |
|:------|:----|:-----:|
| j.u.c.Semaphore | カウンティング・セマフォ | 1.5 |
| _j.u.c.locks.Lock_ | ロック操作インタフェース | 1.5 |
| _j.u.c.locks.Condition_ | Lockから取得する条件変数 | 1.5 |
| j.u.c.locks.ReentrantLock | 排他制御（ミューテックス） | 1.5 |
| j.u.c.locks.ReentrantReadWriteLock | 共有/排他ロック（Reader-Writerロック） | 1.5 |
| j.u.c.locks.StampedLock | 楽観的Read操作＋共有/排他ロック | 1.8 |
| j.u.c.SynchronousQueue&lt;E&gt; | 単一値の同期転送 | 1.5 |
| j.u.c.Exchanger&lt;V&gt; | 2スレッド間の同期値交換 | 1.5 |
| j.u.c.CountDownLatch | 複数スレッド到達まで同期待機 | 1.5 |
| j.u.c.CyclicBarrier | 同期バリア（ランデブー・ポイント） | 1.5 |
| j.u.c.Phaser | フェーズ同期機構 | 1.7 |


## 低レイヤ同期プリミティブ
| クラス | 概要 | Since |
|:------|:----|:-----:|
| j.u.c.locks.LockSupport | ロック機構実装用の低レイヤ同期プリミティブ | 1.5 |
| j.u.c.locks.AbstractQueuedSynchronizer | ロック機構実装用の低レイヤ同期プリミティブ | 1.5 |
| j.u.c.locks.AbstractQueuedLongSynchronizer | ロック機構実装用の低レイヤ同期プリミティブ | 1.6 |
| j.u.c.locks.AbstractOwnableSynchronizer | ロック機構実装用の低レイヤ同期プリミティブ | 1.6 |


## アトミック変数
| 構文 / クラス | 概要 | Since |
|:----------|:----|:-----:|
| volatileフィールド | （部分的な）アトミック変数 | 1.0 |
| j.u.c.atomic.AtomicBoolean | boolean型アトミック変数 | 1.5 |
| j.u.c.atomic.AtomicInteger | int型アトミック変数 | 1.5 |
| j.u.c.atomic.AtomicLong | long型アトミック変数 | 1.5 |
| j.u.c.atomic.AtomicReference&lt;V&gt; | 参照型アトミック変数 | 1.5 |
| j.u.c.atomic.AtomicMarkableReference&lt;V&gt; | {参照型,マークビット}ペア アトミック変数 | 1.5 |
| j.u.c.atomic.AtomicStampedReference&lt;V&gt; | {参照型,スタンプ値}ペア アトミック変数 | 1.5 |
| j.u.c.atomic.AtomicIntegerArray | int型配列アトミック変数 | 1.5 |
| j.u.c.atomic.AtomicLongArray | long型配列アトミック変数 | 1.5 |
| j.u.c.atomic.AtomicReference&lt;E&gt; | 参照型配列アトミック変数 | 1.5 |
| j.u.c.atomic.AtomicIntegerFieldUpdater&lt;T&gt; | int型フィールドTアトミック更新操作 | 1.5 |
| j.u.c.atomic.AtomicLongFieldUpdater&lt;T&gt; | long型フィールドTアトミック更新操作 | 1.5 |
| j.u.c.atomic.AtomicReferenceFieldUpdater&lt;T,V&gt; | 参照型フィールドTアトミック更新操作 | 1.5 |
| j.u.c.atomic.LongAdder | long型アトミック加算操作 | 1.8 |
| j.u.c.atomic.DoubleAdder | double型アトミック加算操作 | 1.8 |
| j.u.c.atomic.LongAccumulator | long型アトミックア2項演算操作 | 1.8 |
| j.u.c.atomic.DoubleAccumulator | double型アトミック2項演算操作 | 1.8 |


## 低レイヤメモリアクセス操作
| クラス | 概要 | Since |
|:--------|:----|:-----:|
| java.lang.invoke.VarHandle | アトミック処理実装用のメモリアクセス操作 | 1.9 |


## スレッドローカル変数
| クラス | 概要 | Since |
|:--------|:----|:-----:|
| java.lang.ThreadLocal&lt;T&gt; | スレッドローカル変数 | 1.2 |
| java.lang.InheritableThreadLocal&lt;T&gt; | 子スレッドへ値継承するスレッドローカル変数 | 1.2 |


## Executorsフレームワーク
| クラス / _インタフェース_  / メソッド| 概要 | Since |
|:--------|:----|:-----:|
| _java.lang.Runnable_ | 戻り値なし非同期タスク | 1.0 |
| _j.u.c.Callable&lt;T&gt;_ | 戻り値Tの非同期タスク | 1.5 |
| j.u.c.FutureTask&lt;T&gt; | 戻り値Tの取消可能な非同期タスク | 1.5 |
| _j.u.c.Future&lt;T&gt;_ | 非同期タスクの結果T | 1.5 |
| _j.u.c.ExecutorService_ | タスク実行サービス操作インタフェース | 1.5 |
| _j.u.c.Executor#execute_ | 非同期タスク(Runnable)の実行 | 1.5 |
| _j.u.c.ExecutorService#submit_ | 非同期タスクの実行とFutrue&lt;T&gt;取得 | 1.5 |
| _j.u.c.ExecutorService#shutdown_ | タスク実行サービス 受付停止要求 | 1.5 |
| _j.u.c.ExecutorService#shutdownNow_ | タスク実行サービス 即時停止要求 | 1.5 |
| _j.u.c.ExecutorService#awaitTermination_ | タスク実行サービス 完了待機 | 1.5 |
| j.u.c.Executors#newSingleThreadExecutor | シングルスレッド実装ExecutorServiceを作成 | 1.5 |
| j.u.c.Executors#newFixedThreadPool | 固定スレッド数のスレッドプール実装ExecutorServiceを作成 | 1.5 |
| j.u.c.Executors#newCachedThreadPool | 動的スレッド数のスレッドプール実装ExecutorServiceを作成 | 1.5 |
| j.u.c.Executors#newWorkStealingPool | Work-Stealスレッドプール実装ExecutorServiceを作成 | 1.8 |
| _j.u.c.ScheduledExecutorService_ | 開始遅延/周期タスク実行サービス操作インタフェース | 1.5 |
| _j.u.c.ScheduledExecutorService#schedule_ | 非同期タスクの遅延実行 | 1.5 |
| _j.u.c.ScheduledExecutorService#scheduleAtFixedRate_ | 非同期タスク(Runnable)の周期実行 | 1.5 |
| _j.u.c.ScheduledExecutorService#scheduleWithFixedDelay_ | 非同期タスク(Runnable)の周期実行 | 1.5 |
| j.u.c.Executors#newSingleThreadScheduledExecutor | シングルスレッド実装ScheduledExecutorServiceを作成 | 1.5 |
| j.u.c.Executors#newScheduledThreadPool | スレッドプール実装ScheduledExecutorServiceを作成 | 1.5 |
| j.u.c.ExecutorCompletionService&lt;V&gt; | 非同期タスクの完了順取得 | 1.5 |


## Fork/Joinフレームワーク
| クラス / メソッド| 概要 | Since |
|:--------|:----|:-----:|
| j.u.c.ForkJoinTask&lt;V&gt; | Fork/Join抽象タスク | 1.7 |
| j.u.c.RecursiveAction | 戻り値なしFork/Joinタスク | 1.7 |
| j.u.c.RecursiveTask&lt;V&gt; | 戻り値V型のFork/Joinタスク | 1.7 |
| j.u.c.CountedCompleter&lt;V&gt; | 完了時処理指定つきFork/Joinタスク | 1.8 |
| j.u.c.ForkJoinPool | Fork/Joinタスク実行ExecutorService | 1.7 |
| j.u.c.ForkJoinPool#execute | 戻り値なしFork/Joinタスク実行 | 1.7 |
| j.u.c.ForkJoinPool#invoke | Fork/Joinタスク実行と戻り値取得 | 1.7 |
| j.u.c.ForkJoinPool#submit | Fork/Joinタスク投入 | 1.7 |
| j.u.c.ForkJoinWorkerThread | Fork/Join実行ワーカスレッド | 1.7 |


## CompletableFuture API
| クラス / _インタフェース_  / メソッド| 概要 | Since |
|:--------|:----|:-----:|
| _j.u.c.CompletionStage&lt;T&gt;_ | 非同期計算ステージ（継続）インタフェース | 1.8 |
| j.u.c.CompletableFuture&lt;T&gt; | 継続可能な非同期タスク | 1.8 |
[j.u.c.CompletableFutureクラス](http://d.hatena.ne.jp/yohhoy/20141025/p1)の非同期処理はExecutorsフレームワークまたはFork/Joinフレームワーク上で動作する。


## Stream API
| メソッド | 概要 | Since |
|:--------|:----|:-----:|
| _java.util.stream.BaseStream#parallel_ | 並列ストリームへの変換 | 1.8 |
| java.util.Collection#parallelStream | コレクション要素の並列ストリーム取得 | 1.8 |
| java.util.SplittableRandom | 乱数ストリームの生成 | 1.8 |
Stream API並列ストリーム処理はFork/Joinフレームワーク上に実装されている。ExecutorServiceとしてForkJoinPool.commonPool()が利用される。


## Reactive Streams API
| クラス / _インタフェース_ | 概要 | Since |
|:--------|:----|:-----:|
| _j.u.c.Flow.Publisher&lt;T&gt;_ | Publisherインタフェース | 1.9 |
| _j.u.c.Flow.Subscriber&lt;T&gt;_ | Subscriberインタフェース | 1.9 |
| _j.u.c.Flow.Processor&lt;T,R&gt;_ | Processorインタフェース | 1.9 |
| _j.u.c.Flow.Subscription_ | Subscriptionインタフェース | 1.9 |
| j.u.c.SubmissionPublisher&lt;T&gt; | Publisher実装 | 1.9 |

アプリケーション実装者向けではなく、[Reactive Streamsフレームワーク実装者用の共通基盤API](http://qiita.com/yohhoy/items/3d5ba35397127ffc3915)。


## 非同期I/O（NIO.2）
| クラス / _インタフェース_ | 概要 | Since |
|:--------|:----|:-----:|
| _j.u.c.Future&lt;T&gt;_ | 非同期I/O要求の結果 | 1.5 |
| _java.nio.channels.CompletionHandler&lt;V,A&gt;_ | 非同期I/Oの完了ハンドラ | 1.7 |
| java.nio.channels.AsynchronousFileChannel | 非同期ファイルI/O | 1.7 |
| java.nio.channels.AsynchronousServerSocketChannel | 非同期サーバソケット | 1.7 |
| java.nio.channels.AsynchronousSocketChannel | 非同期ソケット | 1.7 |
| java.nio.channels.AsynchronousChannelGroup | 非同期チャネルのグループ化 | 1.7 |


## 外部プロセス
| クラス / メソッド | 概要 | Since |
|:--------|:----|:-----:|
| java.lang.Runtime#exec | 外部プロセス起動 | 1.0 |
| java.lang.ProcessBuilder | 外部プロセス起動 | 1.5 |
| java.lang.Process#waitFor | 外部プロセス終了待機 | 1.0 |
| java.lang.Process#waitFor | タイムアウト付き外部プロセス終了待機 | 1.8 |
| java.lang.Process#onExit | 外部プロセス終了ハンドラ | 1.9 |
| java.lang.Process#getInputStream | 外部プロセス/標準出力 | 1.0 |
| java.lang.Process#getErrorStream | 外部プロセス/エラー出力 | 1.0 |
| java.lang.Process#getOutputStream | 外部プロセス/標準入力 | 1.0 |


## その他
| クラス / メソッド | 概要 | Since |
|:--------|:----|:-----:|
| java.lang.StringBuffer | スレッドセーフな文字列連結 | 1.0 |
| java.lang.StringBuilder | スレッドアンセーフな文字列連結 | 1.5 |
| java.lang.Math#random | スレッドセーフな乱数生成処理 | 1.0 |
| java.util.Random | スレッドセーフな乱数生成器 | 1.0 |
| j.u.c.ThreadLocalRandom | スレッドローカル乱数生成器 | 1.7 |
| java.util.Arrays#sort | 配列の逐次ソート | 1.2 |
| java.util.Arrays#parallelSort | 配列の並列ソート | 1.8 |
| java.util.Arrays#setAll | 配列要素への逐次設定 | 1.8 |
| java.util.Arrays#parallelSetAll | 配列要素への並列設定 | 1.8 |
| java.util.Arrays#parallelPrefix | 並列プレフィックス・スキャン | 1.8 |
スレッド間共有が不要ならStringBuilder, ThreadLocalRandomを優先利用する。
java.util.Arrays#parallelSort処理ではForkJoinPool.commonPool()が利用される。