Description :
Single Threaded Execution 代表以一個線程執行的意思,也稱critical section(臨界區)。
該 Pattern 用來限制只能讓一個線程進行,也是多線程的基礎。
Role:
Shared Resource (SR)(共享資源):
SR是會被多線程共同存取的類別,該類別的方法可以分為2類:
1. Safe method : 多線程同時存取也不會出錯的方法。
2. UnSafe method : 多線程同時存取會出錯的方法,需要加上防護(synchronized)限制單線程去存取。e.g.,
BankRunnable bankRunnable = new BankRunnable();
Thread thread1 = new Thread(bankRunnable,"1");
Thread thread2 = new Thread(bankRunnable,"2");
thread1.start();
thread2.start();
bankRunnable 就是 SR 的角色,因為它會被 thread1 和 thread2 共同存取。
public class BankRunnable implements Runnable{
private Bank mBank;
public BankRunnable(Bank bank) {
mBank = bank;
}
public BankRunnable(){
mBank = new Bank("in BankRunnable",1000);
}
@Override
public void run() {
makeDraw();
}
private synchronized void makeDraw() {
System.out.println("Thread in makeDraw:"+Thread.currentThread().getName());
while (mBank.getMoney() >= 100) {
try {
Thread.sleep(new Random().nextInt(500));
} catch (InterruptedException e) {
e.printStackTrace();
}
mBank.withDraw(100);
System.out.println("Thread:"+Thread.currentThread().getName()+" "+mBank.getName() + " " + mBank.getMoney());
if (mBank.getMoney() < 0) {
System.out.println("over draw");
}
}
}
}
而 BankRunnable 的方法中,makeDraw 即為 unsafe method , 其他的方法即是 safe method。
對於 unsafe method 必須加上 synchronized 來保證同步化。
When to use??
滿足以下 3 個條件
1. 多線程。
2. 出現 shared resource。
3. shared resource 的狀態(屬性)會發生變化,若狀態(屬性)不會發生變化,不需要使用synchronized。
Note :
1.使用 synchronized 需要注意死鎖(deadlock),死鎖為2個線程分別獲取鎖定,互相等待對方解鎖的情況。
發生死鎖,程序會無法進行下去。
但要達到死鎖也必須滿足下列其一:
1.具有多個shared resource。
2.線程鎖定一個shared resource,還沒解鎖前就去鎖定另一個shared resource。
3.取得 shared resource 的參與者順序不固定。
只要破壞上述條件其一就可避免死鎖。
2.unsafe method 複寫問題,若有 subclass 繼承 BankRunnable 並複寫了 makeDraw() 方法,但沒有加上
synchronized來修飾,同步化的問題又會出現,可以使用 final 來修飾superclass避免繼承。
3. 原子操作:
synchronized 的方法同時只有一個線程可以操作,因此這個方法為原子的操作。
java的基本類型(除了long和double以外)和物件的賦值和引用也都是原子的。
在宣告屬性時加上volatile 代表所有對該屬性的操作都是不可分割的。
4.因此 single threaded execution pattern 可以簡單的描述為以下步驟
1.找出多線程的 shared resource。
2.找出shared resource 的 unsafe method 方法。
3.將 unsafe method 方法加上 synchronized。
4.考慮死鎖或其他效率問題。