結城先生のデザパタ本マルチスレッド編 第2章のまとめ

問題

複数のスレッドがインスタンスを共有しているが、インスタンスの状態は変化しない。 このときに、何も考えず Single Threaded Execution パターンを使うとスループットが落ちてしまいます。

解決方法

インスタンスが状態変化しないのであれば Single Threaded Execution パターンを使う必要はありません。 その場合は意図しない状態変化を防ぐためにフィールドが変化しないようにする Immutable パターンを用います。 不変性を保つのは大変なので、気をつけて実装する必要があります。またドキュメントにクラスが不変であることを明示する方が良いでしょう。

関連するパターン

  • 状態を変更するスレッドが参照するスレッドの数よりも少ないときは、Read-Write Lock パターンが使えます

コード例はあまりにもつまらないので割愛

適用可能性

  • インスタンスの生成後、状態が変化しない時
  • インスタンスが共有され、頻繁にアクセスされるとき

余談

mutable なクラスと immutable なクラス

Java 標準ライブラリには mutable なクラスと immutable なクラスが対になっているものがある。

  • java.lang.String
  • java.lang.StringBuffer

不変性を守るために

  • フィールドの保持している mutable なインスタンスをそのまま返すようなことをすると不変性が破られる可能性がある
  • コンストラクタに引数として渡したインスタンスをそのままフィールドに代入した場合、不変性が破られる可能性がある

About

ウェブ界隈でエンジニアとして労働活動に励んでいる @gomi_ningen 個人のブログです

Copyright © 53ningen.com