1.飢漢模式 java
public class Singleton{ //飢漢模式: 建立私有靜態化實例,在類初次加載時即初始化 private static final Singleton instance = new Singleton(); //將Singleton()構造方法級別置爲private private Singleton(){}; //公有靜態方法,獲取單例實例 public static Singleton getInstance(){ return instance; } }
2.飽漢模式(雙重檢查)多線程
public class Singleton{ //飽漢模式:在類初次加載時不進行實例初始化,當須要使用實例時初始化(volatile爲必須) private static volatile Singleton instance = null; //將Singleton()構造方法級別置爲private private Singleton(){}; //雙重檢查,當實例instance爲null時,初始化該實例 public static Singleton getInstance(){ if( instance == null ){ //加鎖 synchronized(Singleton.class){ if( instance == null ){ instance = new Singleton(); } } } return instance; } }
3.靜態嵌套類(推薦)線程
public class Singleton{ //將Singleton()構造方法級別置爲private private Singleton(){}; //靜態嵌套類內部初始化實例 private static class SingletonInstance{ private static final Singleton instance = new Singleton(); } //獲取實例方法 public static Singleton getInstance(){ return SingletonInstance.instance; } }
注:code
在上2例,若是不使用volatile關鍵字,則在多線程狀況下,因爲JMM(Java內存模型)的緣由,可能致使非單例狀況,利用volatile的可見性可解決該問題(JDK1.5及以後).內存
枚舉類很特殊,在類加載的時候會初始化全部實例,且不會再次被實例化(由JVM保證),也能夠實現單例(不推薦使用).get
靜態嵌套類與內部類不一樣.class