Skip to content
閲覧中:
並列処理100本ノック

並列処理100本ノック

並列処理(java.util.concurrent)は、Java Gold試験においてStream APIと並ぶ最難関分野です。スレッドの安全性、ロック機構、そして高機能なコレクションの理解が求められます。

試験に出る「急所」を100個のチェックリストにまとめました。


1. スレッドの基本とRunnable/Callable (1-15)

  1. Threadクラスの継承 vs Runnableインターフェースの実装
  2. Thread.start()Thread.run() の違い(後者は別スレッドにならない)
  3. Runnable:戻り値なし(void)、チェック例外を投げられない
  4. Callable<V>:戻り値あり(V)、チェック例外を投げられる
  5. Thread.sleep():スレッドを一時停止(InterruptedException)
  6. Thread.join():対象スレッドの終了を待機
  7. Thread.interrupt():待機中のスレッドに割り込み
  8. isInterrupted() vs interrupted()(後者はフラグをクリアする)
  9. デーモンスレッド:メインスレッド終了時に強制終了されるスレッド
  10. スレッドの優先度(setPriority)はOS依存で保証されない
  11. yield():他のスレッドに実行権を譲るヒント
  12. スレッドの状態:NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED
  13. synchronizedキーワードによる排他制御(インスタンスロック)
  14. synchronizedスタティックメソッド(クラスロック)
  15. volatileキーワード:メモリの可視性を保証し、キャッシュを無効化する

    2. Executor Service フレームワーク (16-30)

  16. ExecutorService:スレッドの管理と実行を分離

  17. Executors.newSingleThreadExecutor():単一スレッド
  18. Executors.newFixedThreadPool(n):固定数のスレッド
  19. Executors.newCachedThreadPool():必要に応じてスレッドを生成
  20. execute(Runnable):タスクの実行(戻り値なし)
  21. submit(Callable/Runnable):タスクの実行(Futureを返す)
  22. shutdown():新規タスクを拒否し、実行中のタスク完了を待つ
  23. shutdownNow():実行中のタスクを中断し、待機中タスクを破棄
  24. isShutdown() vs isTerminated()
  25. awaitTermination():終了まで一定時間待機
  26. Future.get():結果が出るまでブロッキング(待機)
  27. Future.isDone():完了確認
  28. Future.cancel(boolean):タスクのキャンセル
  29. invokeAll(Collection<Callable>):全タスクの完了を待つ
  30. invokeAny(Collection<Callable>):どれか1つ完了するのを待つ

    3. Scheduled Executor Service (31-40)

  31. Executors.newScheduledThreadPool(n)

  32. schedule(Callable, delay, unit):一定時間後に実行
  33. scheduleAtFixedRate:**開始時点**を基準に一定間隔で実行
  34. scheduleWithFixedDelay:**終了時点**を基準に一定間隔で実行
  35. FixedRate でタスクが遅延した場合の挙動(連続して実行される)
  36. 例外発生時の挙動(以降のスケジュールが停止する)

    4. スレッドセーフなコレクション (41-55)

  37. ConcurrentHashMap:セグメントロックによる高速なMap

  38. CopyOnWriteArrayList:書き込み時に配列をコピー(参照は高速)
  39. ConcurrentLinkedQueue:非ブロッキングQueue
  40. BlockingQueue:要素がない場合に待機するQueue
  41. ArrayBlockingQueue:サイズ固定のBlockingQueue
  42. LinkedBlockingQueue:サイズ任意(デフォルト無限)
  43. PriorityBlockingQueue:優先度付き
  44. put() / take():空/満杯時にブロッキングするメソッド
  45. offer(e, time, unit):タイムアウト付き追加
  46. ConcurrentSkipListMap:ソート済みスレッドセーフMap
  47. ConcurrentSkipListSet:ソート済みスレッドセーフSet
  48. 従来の Collections.synchronizedList との違い(ロック範囲の違い)
  49. ConcurrentHashMapnull のキーと値を許可しない
  50. Iteratorfail-safe 挙動(実行中の変更でも例外が出ない)

    5. ロックと同期ユーティリティ (56-70)

  51. ReentrantLock:明示的なロック(lock / unlock)

  52. lock.tryLock():ロック取得を試み、失敗しても即戻る
  53. lock.unlock() は必ず finally ブロックで呼ぶ
  54. ReadWriteLock:読み取り同士はブロックしないロック
  55. ReentrantReadWriteLock
  56. CyclicBarrier:全スレッドが揃うまで待機(再利用可能)
  57. CountDownLatch:カウントが0になるまで待機(再利用不可)
  58. Semaphore:利用可能なリソース数を制限
  59. acquire() / release()
  60. Exchanger:2つのスレッド間でデータを交換
  61. デッドロック:互いにロックを待ち続けて停止
  62. ライブロック:互いに譲り合って進まない
  63. スレッド・スターベーション:特定の優先度が低いスレッドが実行されない
  64. アトミック変数(AtomicInteger, AtomicReference 等)
  65. CAS (Compare-And-Swap) アルゴリズムによる非ロック同期

    6. Fork/Join フレームワーク (71-85)

  66. ForkJoinPool:タスクを分割して並列実行

  67. RecursiveTask<V>:戻り値があるタスク
  68. RecursiveAction:戻り値がないタスク
  69. compute():タスク分割のロジックを書くメソッド
  70. fork():サブタスクを非同期実行
  71. join():サブタスクの結果を待機
  72. invoke():フォークとジョインを開始
  73. ワークスティーリング:暇なスレッドが他のスレッドのタスクを奪って実行
  74. タスク分割の閾値(threshold)の設定重要性
  75. commonPool():デフォルトのプール

    7. 並列Streamの深掘り (86-100)

  76. parallelStream()parallel() の関係

  77. reduce の 3引数形式(identity, accumulator, combiner)
  78. 並列時の identityaccumulator の結果を変えない値であること
  79. combiner は 2つの部分結果をどう結合するか定義する
  80. 無限ストリームを並列化する際のリスク
  81. findAny が並列で非決定的な値を返す理由
  82. unordered() による並列処理の最適化
  83. spliterator():並列分割のためのイテレータ
  84. trySplit():Spliteratorを分割する
  85. characteristics():ストリームの特性(ORDERED, DISTINCT等)
  86. スレッドセーフでない状態へのアクセス(副作用)の危険性
  87. System.out.println は同期処理なので並列Stream内ではボトルネックになる
  88. Runtime.getRuntime().availableProcessors():使用されるスレッド数の基準
  89. ThreadLocal:スレッドごとに独立した変数を保持
  90. CompletableFuture:非同期処理の連鎖(Java 8+)

試験対策アドバイス

Java Gold試験では、「どのインターフェースが戻り値を持ち、どの例外を投げるか」**や、「スレッドセーフなコレクションのプロパティ(nullの許容など)」**が非常に細かく問われます。

まずは最初のセクション、**「1. スレッドの基本とRunnable/Callable (1-15)」**の具体的なコード例から確認していきますか?