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

読書会情報

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

質問・議論

check メソッドを synchronized にしないことについて

  • 質問: pass -> check -> toString と呼び出されるので結局ロックは 2 回取得される?
  • 回答: そうなる。toString は public メソッドで synchronized は必要。
  • (続): Java の synchronized は再入可能なのでデッドロックすることはない。
  • 質問: 2 回ロックを取得することでパフォーマンスの不利はあるか?
  • 回答: あると思う。
  • 意見: 大抵のメジャーな実装では、再入時のオーバーヘッドは軽微。

ロックを取得しない方法について

  • 質問: Single Thread Execution を使わずに安全性を確保する方法は?
  • 回答: Immutable パターンなど
  • 意見: java.util.concurrent.atomic パッケージの AtomicReference 等のクラスを使えばどうか。
  • 回答: それは排他制御しているという意味で Single Thread Execution に含まれるのではないか。
  • (続): クリティカルセクションを狭められることでパフォーマンスは向上するかもしれない。

適用可能性について

  • 質問: 「安全性を保つ必要があるとき」とあるが安全性が不要な場合というのはあるのか?
  • 回答: 複数スレッドからアクセスされないという意味かもしれない。
  • 意見: 壊れても構わないケースもあるかもしれないが思いつかない。

デッドロックの回避について

  • 質問: 共有リソース A, B, C で A, B をロック、A, C をロックというようなケースは半順序でよいのか?
  • 回答: そうだと思う。

Semaphore について

  • 質問: Semaphore は try-with-resources 構文を使えないのか?
  • 回答: acquire メソッドの戻り型が void なので使えない。
  • 意見: 自分でラップして close メソッドで release するように実装すればよいのでは。
  • 質問: API リファレンスによると Semaphore のコンストラクタに負数も指定できる。用途が分からない。
  • 回答: デッドロックの回復に使えると書いてあるが、よく分からない。