Click here to load reader
Upload
appresso-engineering-team
View
273
Download
0
Embed Size (px)
DESCRIPTION
「デザインパターン入門 マルチスレッド編」輪読会、第1回「Single Threaded Execution」のスライド。
Citation preview
第1回Single Threaded Execution
開発部てるー
マルチスレッドプログラムの安全性
安全性とは、オブジェクトのフィールドが予想外の値をとらないことを意味する
複数のスレッドが利用しても安全性が保たれるクラスをスレッドセーフなクラスと呼ぶ
Single Threaded Execution パターンとは
● 同時に1つのスレッドだけしか処理を実行できないように制限を設けるパターン
● 別の呼び方○ Critical Section○ Critical Region
登場人物
● SharedResource 役○ 複数のスレッドからアクセスされるクラス○ もっているメソッドは以下の2つに分類される
■ safeMethod■ unsafeMethod
safeMethod
複数のスレッドから同時に呼び出しても、もともと問題のないメソッド
unsafeMethod
複数のスレッドから同時に実行されると、インスタンスの状態が矛盾する恐れのあるメソッド
unsafeMethod
複数のスレッドから同時に実行されると、インスタンスの状態が矛盾する恐れのあるメソッド
複数のスレッドからアクセスされないようにガードする必要がある
解決法
unsafeMethod を、同時に1つのスレッドからしかアクセスできないようにガードする
Java では、unsafeMethod を synchronized メソッドにすることでガードを実現する
どんなときに使うのか?
● マルチスレッドのとき
● 複数のスレッドからアクセスされるとき
● 状態が変化する可能性があるとき
● 安全性を保つ必要があるとき
デッドロック
2つのスレッドが2つのロックを取り合い、互いに相手のスレッドがロックを解放するのを待つ現象。
Single Threaded Execution パターンがデッドロックを起こす条件
1. 複数の SharedResource 役がある
2. スレッドが、ある SharedResource 役のロックを取ったまま、他の SharedResource 役のロックを取りに行く
3. SharedResource 役のロックを取る順序が定まっていない
継承異常
SharedResource 役のフィールドがサブクラスからアクセス可能になっている
+サブクラスにガードされていない unsafeMethod を作ってしまう
=安全性が失われる
パフォーマンス
Single Threaded Execution パターンは以下の理由により、パフォーマンスを低下させる
● ロックの取得に時間がかかるため
● スレッドの衝突によって待たされるため
お わ り