用兩個鎖解決單例模式的同步

老老猿發表於2005-01-14
public class Singleton {

private static Singleton instance = null;

static int i = 0;
//建例項鎖 鎖命令: i++ ,所有執行緒都可以開鎖就是: i-- 命令,
//開鎖的可能需要重新鎖上。只有有資格建立例項的不用重新鎖,有資格建立例項的條件時第一個開鎖

static int j = 0;
//監視器 當多個例項開鎖時監視是否有最先開鎖的

public static Singleton getInstance() {

if (instance == null && i == 0) {
//如果沒有例項,並且執行緒被鎖(就是沒執行緒可以最先開鎖)

i++;
//進門就關門
j++;
//開始監視


//“開鎖-重鎖” 迴圈過程。 最先開鎖的執行緒可以不重鎖以建例項
while (i == j) {
//迴圈 如果沒有一個執行緒能最先開鎖
//則此次過程失敗,迴圈下去.

i--; //開鎖

if (j == i + 1) {
//本執行緒最先開鎖,可以不重鎖
instance = new Singleton();
//建例項,不重鎖
}
else {
//不是第一個開鎖的,可能和其執行緒一起開鎖,也可能落後其他執行緒

i++;
//重鎖

}
}
}

while (instance == null) {
//已經有執行緒最先開鎖 只是沒建完例項。等待
try {
Thread.sleep(1);
}
catch (InterruptedException ex) {

}
}

return instance;

}
}

相關文章