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

読書会情報

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

質問・議論

Consumer 役が単数のケースについて

  • 質問: consumer が単数なら take を非 synchronized にできるのか?
  • 回答: できない。put も count を使うため producer 役と干渉する
  • 議論: producer が単数なら MakerThread の nextId は非 synchronized にできる
  • 議論: 使われ方としてイベントディスパッチの例が教科書で説明されている
  • (続): C# でも UI 要素に触るスレッドを単一の UI thread に限定している

Interrupt について

  • 質問: 実際に Thread.interrupt を使う書き方をするのか?
  • 回答: Thread を使うならそうなる
  • 質問: C# だと CancellationToken を使うが違いはあるか?
  • 回答: CancellationToken でも内部で状態を確認する
  • 議論: C# でも Monitor.Wait は CancellationToken を受け取らない
  • (続): 何故だろうか?
  • 質問: CancellationToken とは?
  • 回答: Thread の interrupt, isInterrupted を分離した概念
  • (続): Monitor.Wait も CancellationToken を使えばよいのにと疑問に思った
  • (続): CancellationToken が後から入ったという事情ならわかる
  • 意見: Java でも Thread.interrupt ではなく Future の cancel を呼ぶのが今風
  • (続): ExecutorService を使うと Future を受け取れる

LinkedBlockingQueue について

  • 議論: 要素数に上限がないとあるが Integer.MAX_VALUE が正しい
  • (続): 容量を指定することもできる
  • (続): ArrayBlockingQueue の方は容量の指定が必須

SynchronizedQueue について

  • 質問: SynchronousQueue は多対多でも利用できるのか?
  • 回答: 利用できる
  • 質問: そのときは put や take を要求した順に処理されるのか?
  • 回答: コンストラクタの引数 (fair) で指定できる
  • (続): true を指定すれば要求した順に処理される。false なら保証されない

Exchanger について

  • 質問: Exchanger は SynchronousQueue を使って実現できないのか?
  • 回答: わからない
  • 議論: SynchronousQueue を 2 個使えばどうか
  • (続): 片方で wait してしまうので駄目かもしれない
  • 質問: Exchanger で違う型を受け渡しすることはできるか?
  • 回答: Object 型してダウンキャストすれば可能だが
  • 議論: ジェネリクス型を二つにすれば可能?

サーバクライアント型アーキテクチャでの同期

  • 質問: サーバクライアント型アーキテクチャは Producer-Consumer パターンと言えるか?
  • (続): マルチスレッドではないがアーキテクチャとして
  • 議論: リソースを管理する主体に整合性の担保を集中させる
  • (続): ゲームなどではどうなのだろうか?
  • (続): wait するのではなく整合性が取れていなければ balk するのでは