マルチスレッド処理の基礎(4) - クラス設計に関する留意事項 Part 2

またまた間が空いてしまいましたが、前回の記事の続きです。

スレッドとインスタンスの所有関係を明確化する - スレッドセーフでないクラスの場合

スレッドセーフでないクラスのインスタンスを保護する方法は、基本的には以下の2つの方法しかありません。

  1. インスタンスにアクセスするスレッドを1つに限定する
  2. インスタンスにアクセスするすべての処理を、lockステートメント等を用いて適切な排他制御のもとに行う

ただし、2.の方法は排他制御に誤りがないことの確認がレビューのみでしかできないため、品質を確保することが難しくなります。
そのため、通常は設計レベルでスレッドとインスタンスの所有関係を明確・固定化し、1.の方法で安全性を保証するようにします。実現方法の詳細は、別途解説予定です。


※図中の「actor」は、UML標準で用いられるアクター(人型アイコンで表記するもの)ではなく、並行処理の手法として用いられるアクタークラスを意図しています。

スレッドとインスタンスの所有関係を明確化する - スレッドセーフなクラスの場合

可変でスレッドセーフなクラスを設計する際には、以下の項目に留意する必要があります。

  1. インスタンスにアクセスするスレッドの起動・停止を、どのインスタンスが何を契機に行うか
  2. インスタンスが保持するアンマネージリソースの解放を、どのタイミングで行うか

そのため、スレッドセーフなクラスも、スレッドセーフでないクラスと同様に、極力設計レベルでスレッドとインスタンスの関係を明確化するようにしてください。