LoginSignup
397
389

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-05-25

スレッド制御

クラス / インタフェース / メソッド 概要 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<E> 単一値の同期転送 1.5
j.u.c.Exchanger<V> 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<V> 参照型アトミック変数 1.5
j.u.c.atomic.AtomicMarkableReference<V> {参照型,マークビット}ペア アトミック変数 1.5
j.u.c.atomic.AtomicStampedReference<V> {参照型,スタンプ値}ペア アトミック変数 1.5
j.u.c.atomic.AtomicIntegerArray int型配列アトミック変数 1.5
j.u.c.atomic.AtomicLongArray long型配列アトミック変数 1.5
j.u.c.atomic.AtomicReference<E> 参照型配列アトミック変数 1.5
j.u.c.atomic.AtomicIntegerFieldUpdater<T> int型フィールドTアトミック更新操作 1.5
j.u.c.atomic.AtomicLongFieldUpdater<T> long型フィールドTアトミック更新操作 1.5
j.u.c.atomic.AtomicReferenceFieldUpdater<T,V> 参照型フィールド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<T> スレッドローカル変数 1.2
java.lang.InheritableThreadLocal<T> 子スレッドへ値継承するスレッドローカル変数 1.2

Executorsフレームワーク

クラス / インタフェース / メソッド 概要 Since
java.lang.Runnable 戻り値なし非同期タスク 1.0
j.u.c.Callable<T> 戻り値Tの非同期タスク 1.5
j.u.c.FutureTask<T> 戻り値Tの取消可能な非同期タスク 1.5
j.u.c.Future<T> 非同期タスクの結果T 1.5
j.u.c.ExecutorService タスク実行サービス操作インタフェース 1.5
j.u.c.Executor#execute 非同期タスク(Runnable)の実行 1.5
j.u.c.ExecutorService#submit 非同期タスクの実行とFutrue<T>取得 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<V> 非同期タスクの完了順取得 1.5

Fork/Joinフレームワーク

クラス / メソッド 概要 Since
j.u.c.ForkJoinTask<V> Fork/Join抽象タスク 1.7
j.u.c.RecursiveAction 戻り値なしFork/Joinタスク 1.7
j.u.c.RecursiveTask<V> 戻り値V型のFork/Joinタスク 1.7
j.u.c.CountedCompleter<V> 完了時処理指定つき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<T> 非同期計算ステージ(継続)インタフェース 1.8
j.u.c.CompletableFuture<T> 継続可能な非同期タスク 1.8

j.u.c.CompletableFutureクラスの非同期処理は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<T> Publisherインタフェース 1.9
j.u.c.Flow.Subscriber<T> Subscriberインタフェース 1.9
j.u.c.Flow.Processor<T,R> Processorインタフェース 1.9
j.u.c.Flow.Subscription Subscriptionインタフェース 1.9
j.u.c.SubmissionPublisher<T> Publisher実装 1.9

アプリケーション実装者向けではなく、Reactive Streamsフレームワーク実装者用の共通基盤API

非同期I/O(NIO.2)

クラス / インタフェース 概要 Since
j.u.c.Future<T> 非同期I/O要求の結果 1.5
java.nio.channels.CompletionHandler<V,A> 非同期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()が利用される。

397
389
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
397
389