Effective Java 輪読会 
2014/03/05 
開発部田中
項目69 
wait とnotify よりコンカレンシーユーティリ 
ティを選ぶ
コンカレンシーユーティリティ 
• waitとnotifyの代替として 
• コンカレントコレクションの並行性を排除 
することはできない 
o コンカレントコレクションをロックしても効果なし 
• BlockingQueue, CowntDownLatchなど
ブロックする操作 
• ex. BlockingQueue 
• 生産者-消費者キュー
シンクロナイザー 
• ex. CountDownLatch 
o 指定された数のスレッドが揃うのを待つ 
 ワーカースレッド: 3 
 タイマースレッド: 1 
o 注意点として 
 エグゼキューターの許容スレッド数 
 Thread.currentThread().interrupt() 
 時間間隔の計測にはSystem.nanoTime()
wait とnotify 
• waitメソッドを使用する場合は、常にループ 
イディオムを用いる 
• 可能な限りコンカレンシーユーティリティ 
を使う
項目70 
スレッド安全性を文書化する
syncronized修飾子 
• syncronized修飾子はAPIの一部ではない 
o スレッドセーフを保証する意味は含まれない
安全性の段階 
1. 不変 
2. 無条件スレッドセーフ 
3. 条件付きスレッドセーフ 
4. スレッドセーフではない 
5. スレッド敵対
条件付きスレッドセーフを文書化 
• どの一連の呼び出しが外部同期を必要とし、 
どのロックを獲得しなければならないかを 
明記する 
o ex. Collections.syncronizedMap().keySet()
プライベートロックオブジェクトイディオム 
• ロックオブジェクトをカプセル化すること 
で、サービス拒否攻撃を防ぐ 
• 無条件スレッドセーフのクラスに対しての 
み使用可能 
• 継承のために設計されたクラスに対して有 
効

Effective Java 輪読会 項目69-70