ピコラボで有志により開かれている読書会の議事録を以下ご紹介します。ご興味ありましたら、「お問い合わせ」フォームで気軽にコメントなど頂けると幸いです(なお、議事録の議論内容等は各参加者個人の意見であり、会社の意見ではない点、ご了承ください)。

読書会情報

  • 書籍
    • 増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編
  • 発表対象
    • Chapter 3
    • Chapter 4

質問・議論

LinkedBlockingQueue について

  • 質問: 追加でも待たされることがある?
  • 回答: capacity (最大要素数) が決まっている場合

Java でのローカル変数の初期化について

  • 質問: 最初にわざわざ null で初期化しているのは何故か
  • 回答: InterruptedException のときに null を返している
  • 質問: 定義だけでは駄目だったか
  • 回答: 必要。書かないと compile error になる

while について

  • 質問: wait から出てきた後に再び while で検査するのはなぜか
  • 回答: その人がロックを取れるとは限らない。他の人が取ればまた空になることがある

問題 4-5

  • 議論: 問題の意図がわからない
  • 意見: Thread.start が balking パターンを使っている
  • 意見: main スレッド側で exception が出ても実行中の thread は止まらないので END まで出る

Java の Queue クラスについて

  • 議論: peek メソッドは queue が空の場合に Exception を投げるのではなく null を返す
  • (続): 特殊な値 (null など) を返すメソッドと Exception を返すメソッドが両方用意されているようだ
  • 意見: 例外処理は重いので空のケースが多い場合は null を返すメソッドが効率的なのでは?

LinkedBlockingQueue のサンプルプログラムについて

  • 質問: InterruptedException を受けて null を返すことに問題はないのだろうか?
  • 回答: Queue には null を入れられないので判別不可能になることはない
  • 質問: そもそも Queue に null を入れられないのは何故だろうか?
  • 回答: poll メソッドが空の場合の戻り値として null を使うので入れられなくしている
  • 質問: BlockingQueue の poll(time, unit) はタイムアウトまで待つが poll() は待たない。
  • (続): タイムアウト無しで待ち続けるのは take() という別メソッドがある。何故だろうか?
  • 回答: poll() のシグネチャには throws InterruptedException が付かないので待てない。