单例的实现有多种,有懒汉模式,饿汉模式,枚举方式,静态内部类方式等等,下面说说上面的四种
懒汉模式:加载类时就初始化单例
package creational.pattern.singleton; public class HungrySingleton { // 类初始化时获得实例 private static HungrySingleton INSTANCE = new HungrySingleton();; // 私有化构造器,只能通过getInstance方法获得单例 private HungrySingleton(){} // 获取单例实例 public static HungrySingleton getInstance() { return INSTANCE; } }饿汉模式(双重校验锁)
package creational.pattern.singleton; import java.io.Serializable; /* * jdk 1.5 后可以保证多线程下的安全 */ public class DoubleCheckedLockingSingleton implements Serializable { private static final long serialVersionUID = -1926737179243132977L; private static DoubleCheckedLockingSingleton INSTANCE; private DoubleCheckedLockingSingleton() { } public static DoubleCheckedLockingSingleton getInstance() throws InstantiationException, IllegalAccessException, ClassNotFoundException { if (null == INSTANCE) { synchronized (DoubleCheckedLockingSingleton.class) { if (null == INSTANCE) INSTANCE = (DoubleCheckedLockingSingleton) getClass("creational.pattern.singleton.DoubleCheckedLockingSingleton").newInstance(); } } return INSTANCE; } // 应对不同的类加载器 private static Class getClass(String classname) throws ClassNotFoundException { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); if (classLoader == null) classLoader = DoubleCheckedLockingSingleton.class.getClassLoader(); return (classLoader.loadClass(classname)); } // 应对序列化与反序列化 private Object readResolve() { return INSTANCE; } }枚举方式,枚举只有一个private的构造方法,可以用来做单例模式
package creational.pattern.singleton; enum EnumSingleton { INSTANCE; }静态内部类方式
package creational.pattern.singleton; /* * 可以实现懒加载 */ public class StaticInnerSingleton { private static class SingletonHolder{ private static StaticInnerSingleton INSTANCE = new StaticInnerSingleton(); } private StaticInnerSingleton(){} public static StaticInnerSingleton getInstance() { return SingletonHolder.INSTANCE; } }转载于:https://www.cnblogs.com/liunianfeiyu/p/10092842.html
相关资源:JAVA上百实例源码以及开源项目