用兩個鎖解決單例模式的同步
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;
}
}
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;
}
}
相關文章
- Python:兩個使用單例模式的方法Python單例模式
- 單例模式常用的的兩種寫法單例模式
- 應用最廣的模式——單例模式模式單例
- 詳解 - 單例模式單例模式
- 單例模式 - 只有一個例項單例模式
- iOS 單例模式詳解iOS單例模式
- Java單例模式詳解Java單例模式
- 單例模式——執行緒安全的兩種實現單例模式執行緒
- 用最簡單的例子講解js中解決非同步的方法JS非同步
- 設計模式之單例模式詳解設計模式單例
- 2.3.6.1 單個應用程式的同步
- 單例模式應用場景:單例模式
- 單例模式(含執行緒鎖關鍵字)單例模式執行緒
- 【C++】實現一個簡單的單例模式C++單例模式
- 您的單例模式,真的單例嗎?單例模式
- 用一個通俗易懂的例子徹底說清楚單例模式單例模式
- oracle 死鎖解決方法一例Oracle
- Android中單例模式的幾個坑Android單例模式
- 如何寫出一個好的單例模式單例模式
- 單例模式的常見應用場景單例模式
- 今天解決的兩個問題
- JavaScript中單例模式這樣用JavaScript單例模式
- 兩臺SQL Server資料同步解決方案SQLServer
- c#中單例模式詳解C#單例模式
- Android 設計模式の單例模式——應用最廣的模式Android設計模式單例
- JAVA物件導向高階:static的應用知識--單例模式 單例設計模式應用場景及好處 單例設計模式的實現方式Java物件單例設計模式
- 11g兩個節點RAC搭建單例項DG過程問題以及解決方法單例
- 單例模式單例模式
- 每天一個設計模式之單例模式設計模式單例
- 用Python實現設計模式——單例模式Python設計模式單例
- JS中的單例模式及單例模式原型類的實現JS單例模式原型
- DCL單例模式中的缺陷及單例模式的其他實現單例模式
- 美團一面:會單例模式嗎,寫個單例看看?(8大單例模式實現方式總結)單例模式
- “單例”模式與它在原始碼中的運用單例模式原始碼
- 兩個文字框同步輸入內容程式碼例項
- 程式設計之 同步靜態方法和單例模式的選擇程式設計單例模式
- 你瞭解單例模式的最佳實踐嗎?單例模式
- synchronized 同步執行緒 單例設計模式+double checkingsynchronized執行緒單例設計模式