怎樣實現Singleton模式才是高效和安全的?

2021-08-25 16:26:23 字數 1584 閱讀 5344

關於singleton的實現方式,有如下多種方式,究竟那一種是高效安全的呢? 

1、大家熟知的懶式單例

public class lazysingleton

public static lazysingleton getinstance()

system.out.println("instance.hashcode() : " + instance.hashcode());

return instance;

}private static void letmesleep() catch (interruptedexception e) }}

public static void main(string agrs)

}).start();

new thread(new runnable()

}).start();

}執行結果分析:

let me sleep 3 sec.!

let me sleep 3 sec.!

waking up.

instance.hashcode() : 6413875

waking up.

instance.hashcode() : 21174459

每個執行緒獲取的例項不一樣。

2、好吧,用同步synchronized

有人是這樣實現的:

public static lazysingleton getinstance()

} return instance;

} 這樣是否正確呢,我們還用上面的思路來進行測試:

let me sleep 3 sec.!

let me sleep 3 sec.!

waking up.

instance.hashcode() : 21174459

waking up.

instance.hashcode() : 827574

結果很不幸:(。原因在於在兩個執行緒都執行到了if (null == instance)  裡面的邏輯,然後依次執行    instance = new lazysingleton (); 這樣獲取兩個instance例項就是正常的了。到了這裡,大家都肯定知道在執行 instance = new lazysingleton () 還要判斷下instance是否為空。同步塊影響效能吧?想必答案是肯定的。

3、簡單,安全的寫法:

public class singleton

public static singleton getinstance()

這樣的寫法簡單,也安全。但是考慮到建構函式裡面載入很多東西,勢必延長初始化時間。

4、利用靜態內部類提前例項化

public class holdersingleton

public static class singletonholder

public static holdersingleton getinstance()

private static void letmesleep() catch (interruptedexception e) }}

這個在jvm這乙個層次有第三中山實現方式有何不一樣?

Singleton模式的實現

設計乙個類,我們只能生成該類的乙個例項。因為我們只能生成乙個例項,所以我們必須把建構函式設定為私有函式已禁止他人建立例項。可以定義乙個靜態的例項,在需要的時候建立該例項。public sealed class sinleton1 private static singleton1 instance ...

實現singleton模式2

package swordoffre.gaopengyu 劍指offer2題 實現singleton模式 public class singleton2 private static singleton2 singleton new singleton2 public static singleto...

C 實現Singleton模式

單例模式定義 保證乙個類僅有乙個例項,並提供乙個該例項的全域性訪問點。類的宣告 class singleton singleton singleton m instance nullptr 解法1 執行緒非安全版本 singleton singleton getinstance return m i...