結城先生のデザパタ本マルチスレッド編 第2章のまとめ
問題
複数のスレッドがインスタンスを共有しているが、インスタンスの状態は変化しない。
このときに、何も考えず Single Threaded Execution
パターンを使うとスループットが落ちてしまいます。
解決方法
インスタンスが状態変化しないのであれば Single Threaded Execution
パターンを使う必要はありません。
その場合は意図しない状態変化を防ぐためにフィールドが変化しないようにする Immutable
パターンを用います。
不変性を保つのは大変なので、気をつけて実装する必要があります。またドキュメントにクラスが不変であることを明示する方が良いでしょう。
関連するパターン
- 状態を変更するスレッドが参照するスレッドの数よりも少ないときは、
Read-Write Lock
パターンが使えます
コード例はあまりにもつまらないので割愛
適用可能性
- インスタンスの生成後、状態が変化しない時
- インスタンスが共有され、頻繁にアクセスされるとき
余談
mutable なクラスと immutable なクラス
Java 標準ライブラリには mutable なクラスと immutable なクラスが対になっているものがある。
- java.lang.String
- java.lang.StringBuffer
不変性を守るために
- フィールドの保持している mutable なインスタンスをそのまま返すようなことをすると不変性が破られる可能性がある
- コンストラクタに引数として渡したインスタンスをそのままフィールドに代入した場合、不変性が破られる可能性がある