5. ロックと同期ユーティリティ (56-70)
このセクションでは、synchronizedキーワードだけでは実現で
きない、より高度で柔軟なスレッド同期の仕組みを学びます。
Java Gold試験では、**各クラスのメソッド名と「再利用できるか
どうか」**が頻出ポイントです。
56-58. ReentrantLock(再入可能ロック)¶
synchronizedの代わりに使用する明示的なロックです。
Java
Lock lock = new ReentrantLock();
// 57. tryLock: ロックが取れればtrue、取れなければ即座にfalseを返す(ブロッキング回避)
if (lock.tryLock()) {
try {
// 56. 共有リソースへのアクセス
} finally {
// 58. unlock: 必ずfinallyで呼ばないとデッドロックの原因になる
lock.unlock();
}
}
59-60. ReadWriteLock¶
「読み取りは複数スレッドOK、書き込みは1スレッドのみ」というロックです。
Java
ReadWriteLock rwLock = new ReentrantReadWriteLock();
// 読み取り用ロック
rwLock.readLock().lock();
try { /* 読み取り処理 */ } finally { rwLock.readLock().unlock(); }
// 書き込み用ロック(他の読み取り/書き込みをすべてブロックする)
rwLock.writeLock().lock();
try { /* 書き込み処理 */ } finally { rwLock.writeLock().unlock(); }
61. CyclicBarrier¶
指定した数のスレッドが揃うまで、全員を待機させる「チェックポイント」です。**再利用が可能**なのが特徴です。
Java
CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("全員集合!"));
// 各スレッドで実行
barrier.await(); // 3スレッドがここに来るまで全員停止
62. CountDownLatch¶
カウントが0になるまで待機させます。**一度きりの使い捨て**です。
Java
CountDownLatch latch = new CountDownLatch(3); // カウント3
// メインスレッドで待機
latch.await();
// 別スレッド側で実行
latch.countDown(); // カウントを減らす。0になるとawaitが解除される
63-64. Semaphore(セマフォ)¶
特定のリソースにアクセスできるスレッドの数を制限します。
Java
Semaphore semaphore = new Semaphore(2); // 同時に2人まで許可
semaphore.acquire(); // パーミッション(許可証)を取得。空きがなければ待機
try {
// リソース利用
} finally {
semaphore.release(); // 許可証を返却
}
66-68. スレッドの不具合用語¶
- 66. デッドロック: スレッドAがBの持つロックを待ち、BがAの持つロックを待って永久に止まる。
- 67. ライブロック: 互いに道を譲り合って(状態を変え続けて)、結局どちらも進めない。
- 68. スターベーション: 特定のスレッドがずっと実行権を得られない。
69-70. Atomic変数(アトミック)¶
ロックを使わず、ハードウェアレベルの命令で値を安全に更新します。
Java
AtomicInteger atomicInt = new AtomicInteger(0);
// 70. CAS (Compare-And-Swap) 処理を内部で行う
int newValue = atomicInt.incrementAndGet(); // スレッドセーフに+1して取得
💡 Java Gold 試験対策の「ひっかけ」まとめ¶
- CyclicBarrier vs CountDownLatch:
- 再利用できるのはどっち? →
CyclicBarrier(reset()も可能)。 -
メソッド名は? → Barrierは
await()、LatchはcountDown()。 -
Lockの解除忘れ:
-
試験コードで
lock.lock()の後にfinallyブロックがない場合、それは不適切なコード(例外時にロックが残る)です。 -
ReadWriteLockの優先順位:
- 「読み取りロック」を持っている間は、「書き込みロック」は取得できません。逆も同様です。
次は、タスクを分割して並列実行する 「71-85. Fork/Join フレームワーク」 に進みますか?それともこの範囲の確認問題を解いてみますか?