臨界區模式 Critical Section Pattern 是指在一個共享范圍中只讓一個線程執行的模式.
它是所有其它多線程設計模式的基礎,所以我首先來介紹它.
把著眼點放在范圍上,這個模式叫臨界區模式,假如把作眼點放在執行的線程上,這個模式就叫
單線程執行模式.
首先我們來玩一個鉆山洞的游戲,我 Axman,朋友 Sager,同事 Pentium4.三個人在八角游樂場
循環鉆山洞(KAO,減肥練習啊),每個人手里有一個牌子,每鉆一次洞口的老頭會把當前的次序,
姓名,牌號顯示出來,并檢查名字與牌號是否一致.
OK,這個游戲的參與者有游樂場老頭Geezer,Player,就是我們,還有山洞 corrie.
public class Geezer {
public static void main(String[] args){
System.out. Corrie c = new Corrie();//只有一個山洞,所以生存一個實例后傳給多個Player.
new Player("Axman","001",c).start();
new Player("Sager","002",c).start();
new Player("Pentium4","003",c).start();
}
}
這個類暫時沒有什么多說的,它是一個Main的角色.
public class Player extends Thread{
private final String name;
private final String number;
private final Corrie corrie;
public Player(String name,String number,Corrie corrie) {
this.name = name;
this.number = number;
this.corrie = corrie;
}
public void run(){
while(true){
this.corrie.into(this.name,this.number);
}
}
}
在這里,我們把成員字段都設成final的,為了說明一個Player一旦構造,他的名字和牌號就不能改
變,簡單說在游戲中,我,Sager,Pentium4三個人不會自己偷偷把自己的牌號換了,也不會偷偷地去
鉆別的山洞,假如這個游戲一旦發生錯誤,那么錯誤不在我們玩家.
import java.util.*;
public class Corrie {
private int count = 0;
private String name;
private String number;
private HashMap lib = new HashMap();//保存姓名與牌號的庫
public Corrie(){
lib.put("Axman","001");
lib.put("Sager","002");
lib.put("Pentium4","003");
}
public void into(String name,String number){
this.count ++;
this.name = name;
this.number = number;
if(this.lib.get(name).equals(number))
test():
}
public String display(){
return this.count+": " + this.name + "(" + this.number + ")";
}
新聞熱點
疑難解答