關於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...