Skip to content
閲覧中:
5. ロックと同期ユーティリティ (56-70)

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 試験対策の「ひっかけ」まとめ

  1. CyclicBarrier vs CountDownLatch:
  2. 再利用できるのはどっち?CyclicBarrierreset()も可能)。
  3. メソッド名は? → Barrierは await()、Latchは countDown()

  4. Lockの解除忘れ:

  5. 試験コードで lock.lock() の後に finally ブロックがない場合、それは不適切なコード(例外時にロックが残る)です。

  6. ReadWriteLockの優先順位:

  7. 「読み取りロック」を持っている間は、「書き込みロック」は取得できません。逆も同様です。

次は、タスクを分割して並列実行する 「71-85. Fork/Join フレームワーク」 に進みますか?それともこの範囲の確認問題を解いてみますか?