結城先生のデザパタ本マルチスレッド編 第2章のまとめ
問題
複数のスレッドがインスタンスを共有しているが、インスタンスの状態は変化しない。
このときに、何も考えず Single Threaded Execution パターンを使うとスループットが落ちてしまいます。
解決方法
インスタンスが状態変化しないのであれば Single Threaded Execution パターンを使う必要はありません。
その場合は意図しない状態変化を防ぐためにフィールドが変化しないようにする Immutable パターンを用います。
不変性を保つのは大変なので、気をつけて実装する必要があります。またドキュメントにクラスが不変であることを明示する方が良いでしょう。
関連するパターン
- 状態を変更するスレッドが参照するスレッドの数よりも少ないときは、Read-Write Lock パターンが使えます
コード例はあまりにもつまらないので割愛
適用可能性
- インスタンスの生成後、状態が変化しない時
- インスタンスが共有され、頻繁にアクセスされるとき
余談
mutable なクラスと immutable なクラス
Java 標準ライブラリには mutable なクラスと immutable なクラスが対になっているものがある。
- java.lang.String
- java.lang.StringBuffer
不変性を守るために
- フィールドの保持している mutable なインスタンスをそのまま返すようなことをすると不変性が破られる可能性がある
- コンストラクタに引数として渡したインスタンスをそのままフィールドに代入した場合、不変性が破られる可能性がある
Pinned Articles
About
ウェブ界隈でエンジニアとして労働活動に励んでいる @gomi_ningen 個人のブログです
Tags
JavaScript
PowerShell
kibana
elasticsearch
fluentd
nginx
イベント
五十嵐裕美
村川梨衣
logrotate
IoT
Scala
Java
C言語
iputils
ICMP
WUG
mastodon
Swift
AWS
Clock
Windows
アーキテクチャ
PoEAA
iOS
DeviceFarm
プログラミング言語
OS
StepFunctions
Lambda
Serverless
terraform
ポエム
RHEL
ネットワーク
GraphQL
CloudWatch
Linux
Coreutils
network
nc
telnet
LinuxKernel
fpinscala
ELB
IAM
AppSync
EFS
Gradle
english