4. スレッドセーフなコレクション (41-55)
Java Gold試験において、このセクションは「マルチスレッド環境でも壊れないデータの器」を扱います。従来のArrayListやHashMapはスレッドセーフではないため、複数のスレッドで同時に書き込むとデータが破損したり例外(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など)に進みますか?