臨界區模式 Critical Section Pattern 是指在一個共享范圍中只讓一個線程執行的模式
它是所有其它多線程設計模式的基礎
把著眼點放在范圍上
單線程執行模式
首先我們來玩一個鑽山洞的游戲
循環鑽山洞(KAO
姓名
OK
public class Geezer {
public static void main(String[] args){
System
Corrie c = new Corrie();//只有一個山洞
new Player(
new Player(
new Player(
}
}
這個類暫時沒有什麼多說的
public class Player extends Thread{
private final String name;
private final String number;
private final Corrie corrie;
public Player(String name
this
this
rrie = corrie;
}
public void run(){
while(true){
rrie
}
}
}
在這裡
變
鑽別的山洞
import java
public class Corrie {
private int count =
private String name;
private String number;
private HashMap lib = new HashMap();//保存姓名與牌號的庫
public Corrie(){
lib
lib
lib
}
public void into(String name
unt ++;
this
this
if(this
test():
}
public String display(){
return unt+
}
private void test(){
if(this
;
//System
else
System
}
}
這個類中增加了一個lib的HashMap
所以我用了成員對象而不是靜態實例
該在一個輔助類中實現這樣的數據結構封裝的功能
if(name
if(!number
}
else if
這樣復雜的語句
運行這個程序需要有一些耐心
而且多線程程序在不同的機器上表現不同
機器是多CPU的
在我的筆記本上最終出現錯誤是在
第一種情況是檢查到了錯誤
事實上根據以前介紹的多線程知識
一個線程執行this
this
而出現
this
另外還有可能會出現序號顛倒或不對應
給哪個Player
[正確的Critical Section模式的例子]
我們知道出現這些錯誤是因為Corrie類的方法不是線程安全的
了
import java
public class Corrie {
private int count =
private String name;
private String number;
private HashMap lib = new HashMap();//保存姓名與牌號的庫
public Corrie(){
lib
lib
lib
}
public synchronized void into(String name
unt ++;
this
this
test();
}
public synchronized String display(){
return unt+
}
private void test(){
if(this
;
//System
else
System
}
}
運行這個例子
at least
到這裡我們對Critical Section模式的例程有了直觀的了解
方法安全嗎?為什麼?
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27591.html