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

読書会情報

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

質問・議論

PreferWriter について

  • 質問: どのタイミングで値が変更される?
  • 回答: 読み込みが終わったら true, 書き込みが終わったら false
  • (続): Reader, Writer の一方だけがロックを取り続けることがないようにする
  • 意見: Writer が溜まらないようにしているように見える
  • 質問: どういう状況で誰が wait するかを図示できないか?
  • 回答: (図で説明)
  • 意見: 教科書の信号機のたとえが分かりやすかった
  • 議論: preferWriter が false でも Writer が連続で動くことはあり得る
  • 質問: 確率的にということか?
  • 回答: そう

Balking で実現できるか

  • 質問: Guarded suspension ではなく Balking でも実現できるのか?
  • 回答: ロックを取れたかどうかを bool で返せば実装できそう
  • 議論: 実装としてはそうかもしれない。概念としてはどうか?
  • (続): この章の内容は Read と Write でロックを分けるという内容
  • (続): 排他制御の実現方式と直交するのかという疑問
  • 議論: Balking だと preferWriter が true になったまま Writer が来ないと困る
  • (続): ReadWriteLock が waitingWriter を管理できない
  • 議論: Writer は Guarded Suspension で Reader は Balking なら可能か?
  • 議論: それはできそう

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

  • 質問: 発表資料で途中からコンソールに出力されたのは何だろうか?
  • 補足: (Jupyter Notebook 上で Java コードを実行。途中からブラウザではなくコンソールに出力された)
  • 回答: 原因は分からないが状況としては Reader が start して暫くはブラウザに表示されている
  • (続): その後 Writer が start して Writer がデータを書き換えた後からコンソールに出ている
  • 質問: 教科書の実行例だと比較的すぐに Writer が動いているようだが?
  • 回答: 環境に依存しそう。スレッド生成が重いとかもあるかもしれない

Strategized Locking パターンについて

  • 質問: このパターンは、ロックの取り方をパラメータで渡すということ?
  • 回答: 詳細は調べられなかった。C++ に lock_guard というのがある

ReentrantReadWriteLock について

  • 質問: 再入可能性と降格昇格は何が違う?
  • 回答: 再入は片方のロックを持っている状態でもう一方を取りに行く
  • (続): 降格昇格は持っているロックを変える
  • 質問: Java のリファレンスでは、Reader は書き込みロックを取れないと書いてあるが?
  • 回答: たしかに。教科書の内容とは矛盾しているように思える
  • 議論: 降格昇格というのは再入したうえで元のロックを解放するようだ
  • 議論: ReadLock を複数のスレッドが取っている状態で各々 WriteLock を取りに行くと
  • (続): 互いに wait してデッドロックするのではないだろうか