Skip to content
閲覧中:
4. スレッドセーフなコレクション (41-55)

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

Java Gold試験において、このセクションは「マルチスレッド環境でも壊れないデータの器」を扱います。従来のArrayListHashMapはスレッドセーフではないため、複数のスレッドで同時に書き込むとデータが破損したり例外(ConcurrentModificationException)が発生したりします。

41番から55番まで、主要なスレッドセーフ・コレクションを網羅して解説します。


41, 53. ConcurrentHashMap

HashMapのスレッドセーフ版です。全体をロックするのではなく、内部を分割してロック(セグメントロック)するため、高パフォーマンスです。

Java
// 41. 宣言
Map<String, Integer> map = new ConcurrentHashMap<>();

// 53. 試験ポイント:nullはキーにも値にも絶対に使えない(NullPointerExceptionが発生)
// map.put(null, 1); // 実行時エラー
// map.put("key", null); // 実行時エラー

42, 54. CopyOnWriteArrayList

「書き込み時に配列全体をコピーする」という特殊なリストです。

Java
// 42. 宣言
List<String> list = new CopyOnWriteArrayList<>();
list.add("A");

// 54. Iteratorの挙動(fail-safe)
// 通常のArrayListと違い、ループ中に要素を追加しても例外が発生しない
for (String s : list) {
    list.add("B"); // 例外は出ないが、現在のループ(スナップショット)には反映されない
}

試験ポイント: 読み取りは非常に高速ですが、書き込み(add/set)はコピーが発生するため非常に低速です。

44-49. BlockingQueue

スレッド間の「データの受け渡し」に特化したQueueです。

Java
// 45, 46. 実装クラス
BlockingQueue<String> queue = new ArrayBlockingQueue<>(10); // サイズ固定
// BlockingQueue<String> queue = new LinkedBlockingQueue<>(); // サイズ任意

// 48. ブロッキングメソッド (put / take)
// 要素が満杯なら空きが出るまで待機、空なら要素が来るまで待機する
queue.put("Data");      // 満杯なら待機
String val = queue.take(); // 空なら待機

// 49. タイムアウト付き offer/poll
boolean success = queue.offer("Data", 2, TimeUnit.SECONDS); // 2秒待ってダメなら諦める

50-51. ConcurrentSkipListMap / Set

TreeMapのスレッドセーフ版に相当します。**要素が常にソート(順序維持)される**のが特徴です。

Java
// 50. ソートされるスレッドセーフMap
NavigableMap<Integer, String> skipListMap = new ConcurrentSkipListMap<>();
skipListMap.put(3, "C");
skipListMap.put(1, "A");
skipListMap.put(2, "B");
// 結果: {1=A, 2=B, 3=C} (キー順)

💡 Java Gold 試験対策:比較まとめ表

クラス名 ベース 順序維持 null許可 特徴
ConcurrentHashMap HashMap × 不可 最も一般的。高性能。
CopyOnWriteArrayList ArrayList 読み取り専用に近い用途向き。
ConcurrentSkipListMap TreeMap 不可 スレッドセーフかつソート済み。
ArrayBlockingQueue Queue × スレッド間のタスク受け渡し用。

52. Collections.synchronizedList との違い

試験で問われる「古いやり方」との比較です。

  • Collections.synchronizedList(list):リスト全体を1つのロックで守るため、1人が読み取っている間は他の誰も触れず、遅い。
  • Concurrent...系:ロックを分割したり、コピーを利用したりして「複数のスレッドが同時に触れる」ように工夫されている。

55. まとめ

試験では「このコレクションにnullを入れたらどうなるか?」「ループ中に要素を追加したら例外が出るか?」という挙動が直接問われます。

次は、より高度なスレッド同期メカニズムである 「56-70. ロックと同期ユーティリティ」 (ReentrantLockやCyclicBarrierなど)に進みますか?