Java單例模式實現的幾種方法
阿新 • • 發佈:2018-11-11
package offer; public class Test02 { /** * 01 餓漢模式 執行緒安全 */ public static class Singleton{ private final static Singleton INSTANCE = new Singleton(); private Singleton (){} public static Singleton getInstance(){ return INSTANCE; } } /** * 02 懶漢模式 非執行緒安全 */ public static class Singleton2{ private static Singleton2 instance = null; private Singleton2(){ } public static Singleton2 getInstance(){ if (null == instance ){ instance = new Singleton2();//非執行緒安全 } return instance; } } /** * 03 懶漢模式 執行緒安全 使用synchromized關鍵字修飾 效率低 */ public static class Singleton3{ private static Singleton3 instance = null; private Singleton3(){} public static synchronized Singleton3 getInstance (){ if (null == instance){ instance = new Singleton3(); } return instance; } } /** * 04 餓漢模式 執行緒安全 使用靜態程式碼塊 注意static的順序 */ public static class Singleton4 { private static Singleton4 instance = null; static { instance = new Singleton4(); } private Singleton4(){ } public static Singleton4 getInstance(){ return instance; } } /** * 05 靜態內部類方式 */ public static class Singleton5{ private final static class SingletonHolder{ private static final Singleton5 INSTANCE = new Singleton5(); } private Singleton5(){} public static Singleton5 getInstance(){ return SingletonHolder.INSTANCE; } } /** * 06 列舉形式1 */ public enum Singleton6{ INSTANCE; public void anyMethod(){ } } /** * 07 列舉形式2 推薦 */ public static class EnumSingleton{ private EnumSingleton(){} public static EnumSingleton getInstance(){ return Singleton.INSTANCE.getInstance(); } private static enum Singleton{ INSTANCE; private EnumSingleton singleton; private Singleton(){ singleton = new EnumSingleton(); } public EnumSingleton getInstance(){ return singleton; } } } /** * 07 懶漢模式 執行緒安全 雙重檢驗 */ public static class Singleton7{ //使用volatile防止程式碼重排序,讀到未初始化完成的instance物件 private volatile static Singleton7 instance = null; private Singleton7(){ } public static Singleton7 getInstance(){ if(null == instance){ synchronized(Singleton7.class){//區域性使用同步方法,提高效率 instance = new Singleton7(); } } return instance; } } // test public static void main(String[] args){ System.out.println(Singleton.getInstance()== Singleton.getInstance()); System.out.println(Singleton2.getInstance() == Singleton2.getInstance()); System.out.println(Singleton3.getInstance() == Singleton3.getInstance()); System.out.println(Singleton4.getInstance() == Singleton4.getInstance()); System.out.println(Singleton5.getInstance() == Singleton5.getInstance()); System.out.println(Singleton6.INSTANCE == Singleton6.INSTANCE); System.out.println(EnumSingleton.getInstance() == EnumSingleton.getInstance()); System.out.println(Singleton7.getInstance() == Singleton7.getInstance()); } }