SlideShare a Scribd company logo
1 of 14
Download to read offline
第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 パターンは以下の理 
由により、パフォーマンスを低下させる 
● ロックの取得に時間がかかるため 
● スレッドの衝突によって待たされるため
お わ り

More Related Content

More from Appresso Engineering Team

Effective Java 輪読会 第7章 項目43-44
Effective Java 輪読会 第7章 項目43-44Effective Java 輪読会 第7章 項目43-44
Effective Java 輪読会 第7章 項目43-44
Appresso Engineering Team
 
Effective Java 輪読会 第7章 項目41-42
Effective Java 輪読会 第7章 項目41-42Effective Java 輪読会 第7章 項目41-42
Effective Java 輪読会 第7章 項目41-42
Appresso Engineering Team
 
Effective Java 輪読会 第7章 項目38-40
Effective Java 輪読会 第7章 項目38-40Effective Java 輪読会 第7章 項目38-40
Effective Java 輪読会 第7章 項目38-40
Appresso Engineering Team
 
Effective Java 輪読会 第6章 項目35-37
Effective Java 輪読会 第6章 項目35-37Effective Java 輪読会 第6章 項目35-37
Effective Java 輪読会 第6章 項目35-37
Appresso Engineering Team
 
Effective java 輪読会 第6章 項目32-34
Effective java 輪読会 第6章 項目32-34Effective java 輪読会 第6章 項目32-34
Effective java 輪読会 第6章 項目32-34
Appresso Engineering Team
 
Effective java 輪読会 第6章 項目30-31
Effective java 輪読会 第6章 項目30-31Effective java 輪読会 第6章 項目30-31
Effective java 輪読会 第6章 項目30-31
Appresso Engineering Team
 
Effective java 輪読会 第5章 項目26-29
Effective java 輪読会 第5章 項目26-29Effective java 輪読会 第5章 項目26-29
Effective java 輪読会 第5章 項目26-29
Appresso Engineering Team
 
Effective java 輪読会 第5章 項目23-25
Effective java 輪読会 第5章 項目23-25Effective java 輪読会 第5章 項目23-25
Effective java 輪読会 第5章 項目23-25
Appresso Engineering Team
 

More from Appresso Engineering Team (20)

JavaScript 勉強会 ― 型と値
JavaScript 勉強会 ― 型と値JavaScript 勉強会 ― 型と値
JavaScript 勉強会 ― 型と値
 
Effective Java 輪読会 項目69-70追加
Effective Java 輪読会 項目69-70追加Effective Java 輪読会 項目69-70追加
Effective Java 輪読会 項目69-70追加
 
Effective Java 輪読会 項目69-70
Effective Java 輪読会 項目69-70Effective Java 輪読会 項目69-70
Effective Java 輪読会 項目69-70
 
Effective Java 輪読会 項目66-68
Effective Java 輪読会 項目66-68Effective Java 輪読会 項目66-68
Effective Java 輪読会 項目66-68
 
Effective Java 輪読会 項目71-73
Effective Java 輪読会 項目71-73Effective Java 輪読会 項目71-73
Effective Java 輪読会 項目71-73
 
Java Day Tokyo 2014 まとめ (chen)
Java Day Tokyo 2014 まとめ (chen)Java Day Tokyo 2014 まとめ (chen)
Java Day Tokyo 2014 まとめ (chen)
 
Effective Java 輪読会 項目63-65
Effective Java 輪読会 項目63-65Effective Java 輪読会 項目63-65
Effective Java 輪読会 項目63-65
 
Effective Java 輪読会 項目60-62
Effective Java 輪読会 項目60-62Effective Java 輪読会 項目60-62
Effective Java 輪読会 項目60-62
 
Effective java 輪読会 項目57-59
Effective java 輪読会 項目57-59Effective java 輪読会 項目57-59
Effective java 輪読会 項目57-59
 
Effective Java 輪読会 項目49-52
Effective Java 輪読会 項目49-52Effective Java 輪読会 項目49-52
Effective Java 輪読会 項目49-52
 
Effective Java 輪読会 項目45-48
Effective Java 輪読会 項目45-48Effective Java 輪読会 項目45-48
Effective Java 輪読会 項目45-48
 
Effective Java 輪読会 項目53-56
Effective Java 輪読会 項目53-56Effective Java 輪読会 項目53-56
Effective Java 輪読会 項目53-56
 
Effective Java 輪読会 第7章 項目43-44
Effective Java 輪読会 第7章 項目43-44Effective Java 輪読会 第7章 項目43-44
Effective Java 輪読会 第7章 項目43-44
 
Effective Java 輪読会 第7章 項目41-42
Effective Java 輪読会 第7章 項目41-42Effective Java 輪読会 第7章 項目41-42
Effective Java 輪読会 第7章 項目41-42
 
Effective Java 輪読会 第7章 項目38-40
Effective Java 輪読会 第7章 項目38-40Effective Java 輪読会 第7章 項目38-40
Effective Java 輪読会 第7章 項目38-40
 
Effective Java 輪読会 第6章 項目35-37
Effective Java 輪読会 第6章 項目35-37Effective Java 輪読会 第6章 項目35-37
Effective Java 輪読会 第6章 項目35-37
 
Effective java 輪読会 第6章 項目32-34
Effective java 輪読会 第6章 項目32-34Effective java 輪読会 第6章 項目32-34
Effective java 輪読会 第6章 項目32-34
 
Effective java 輪読会 第6章 項目30-31
Effective java 輪読会 第6章 項目30-31Effective java 輪読会 第6章 項目30-31
Effective java 輪読会 第6章 項目30-31
 
Effective java 輪読会 第5章 項目26-29
Effective java 輪読会 第5章 項目26-29Effective java 輪読会 第5章 項目26-29
Effective java 輪読会 第5章 項目26-29
 
Effective java 輪読会 第5章 項目23-25
Effective java 輪読会 第5章 項目23-25Effective java 輪読会 第5章 項目23-25
Effective java 輪読会 第5章 項目23-25
 

マルチスレッド デザインパターン ― Single Threaded Execution