//保證類只有一個實例,私有其構造器 private SingletonDemo01() { }
//建立自身對象 private static SingletonDemo01 instance = new SingletonDemo01();
//全局公開的方法 public static SingletonDemo01 getInstance() { return instance; }
class SingletonDemo01Test { public static void main(String[] args) { SingletonDemo01 instance = SingletonDemo01.getInstance(); SingletonDemo01 instance2 = SingletonDemo01.getInstance(); System.out.println(instance.hashCode()); System.out.println(instance2.hashCode()); System.out.println(instance == instance2); } }
輸出的結果爲:java
356573597 356573597 true
package com.xgp.company.第一種_單例模式.餓漢式; /** * * 核心:保證一個類只有一個實例,而且提供一個範圍該實例的全局訪問點 */ public class SingletonDemo01 { //保證類只有一個實例,私有其構造器 private SingletonDemo01() { } //建立自身對象 private static SingletonDemo01 instance = new SingletonDemo01(); //全局公開的方法 public static SingletonDemo01 getInstance() { return instance; } } class SingletonDemo01Test { public static void main(String[] args) { SingletonDemo01 instance = SingletonDemo01.getInstance(); SingletonDemo01 instance2 = SingletonDemo01.getInstance(); System.out.println(instance.hashCode()); System.out.println(instance2.hashCode()); System.out.println(instance == instance2); } }
public class SingletonDemo02 { //保證類只有一個實例,私有其構造器 private SingletonDemo02() { } //建立自身對象,當時不用當即加載 private static SingletonDemo02 instance; //全局公開的方法 synchronized做用:加鎖 多線程進來時會不安全,效率較低 public static synchronized SingletonDemo02 getInstance() { if(instance == null) { instance = new SingletonDemo02(); } return instance; } }
public class SingletonDemo03 { //保證類只有一個實例,私有其構造器 private SingletonDemo03() { } //建立自身對象,當時不用當即加載 volatile做用:盡大可能的解決極端狀況的問題 private volatile static SingletonDemo03 instance; //全局公開的方法 synchronized做用:加鎖 多線程進來時會不安全,效率較低 public static SingletonDemo03 getInstance() { if(instance == null) { //定一次進來時加鎖,後面進來時就不加鎖了,提升了效率 synchronized (SingletonDemo03.class) { if(instance == null) { instance = new SingletonDemo03(); } } } return instance; } }
public class SingletonDemo03 { //破壞兩次都用反射建立對象 private static boolean flag = false; //保證類只有一個實例,私有其構造器 private SingletonDemo03() { //防治被反射 synchronized (SingletonDemo03.class) { if(flag == false) { flag = true; }else { throw new RuntimeException("不要試圖用反射破壞單例"); } } } //建立自身對象,當時不用當即加載 volatile做用:盡大可能的解決極端狀況的問題 private volatile static SingletonDemo03 instance; //全局公開的方法 synchronized做用:加鎖 多線程進來時會不安全,效率較低 public static SingletonDemo03 getInstance() { if(instance == null) { //定一次進來時加鎖,後面進來時就不加鎖了,提升了效率 synchronized (SingletonDemo03.class) { if(instance == null) { instance = new SingletonDemo03(); } } } return instance; } }
class SingletonDemo03Test { public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException { /* SingletonDemo03 instance1 = SingletonDemo03.getInstance(); SingletonDemo03 instance2 = SingletonDemo03.getInstance(); System.out.println(instance1 == instance2); */ Class<SingletonDemo03> clazz = SingletonDemo03.class; //反射破壞單例 Constructor<SingletonDemo03> declaredConstructor = clazz.getDeclaredConstructor(null); declaredConstructor.setAccessible(true); SingletonDemo03 instance1 = declaredConstructor.newInstance(); //破壞flag Field flag = clazz.getDeclaredField("flag"); flag.setAccessible(true); flag.set(clazz,false); System.out.println(flag.get(clazz)); SingletonDemo03 instance2 = declaredConstructor.newInstance(); System.out.println(instance1 == instance2); System.out.println(instance1.hashCode()); System.out.println(instance2.hashCode()); } }
運行結果:設計模式
false false 21685669 2133927002
public class SingletonDemo04 { private SingletonDemo04() { //防治被反射 synchronized (SingletonDemo04.class) { if(InnerClass.instance != null) { throw new RuntimeException("不要試圖用反射破壞單例"); } } } private static class InnerClass { private static final SingletonDemo04 instance = new SingletonDemo04(); } public static SingletonDemo04 getInstance() { return InnerClass.instance; } }
@CallerSensitive public T newInstance(Object ... initargs) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { if (!override) { if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) { Class<?> caller = Reflection.getCallerClass(); checkAccess(caller, clazz, null, modifiers); } } if ((clazz.getModifiers() & Modifier.ENUM) != 0) throw new IllegalArgumentException("Cannot reflectively create enum objects"); ConstructorAccessor ca = constructorAccessor; // read volatile if (ca == null) { ca = acquireConstructorAccessor(); } @SuppressWarnings("unchecked") T inst = (T) ca.newInstance(initargs); return inst; }
/** * 反射不能破壞枚舉類型,枚舉類純自然的單例,最簡單 */ public enum SingletonDemo05 { INSTANCE; public SingletonDemo05 getInstance() { return INSTANCE; } public String hello() { return "Hello World!"; } } class SingletonDemo05Test { public static void main(String[] args) { SingletonDemo05 instance1 = SingletonDemo05.INSTANCE; SingletonDemo05 instance2 = SingletonDemo05.INSTANCE.getInstance(); System.out.println(instance1 == instance2); String hello = SingletonDemo05.INSTANCE.hello(); System.out.println(hello); } }