单例模式
定义:确保一个类只有一个实例,并提供一个全局访问点。
类图

实现方式
懒加载:线程安全,调用getInstance时才加载,节省内存,缺点是性能较差,同步几乎只在第一次创建对象时需要。
public class Singleton { private static Singleton instance; private Singleton(){} public static synchronized Singleton getInstance(){ if(instance==null){ instance = new Singleton(); } return instance; } }
急切加载:系统加载时就创建实例,保证线程安全,浪费内存。
public class Singleton { private static Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } }
双重加锁:懒加载的同时保持性能,不使用JDK5以前的版本,实现相对复杂。
public class Singleton { private static volatile Singleton instance;//volatile 保证多线程能正确处理instance变量 private Singleton() { } public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }
利用静态块懒加载:效果类似双重加锁,实现简单一些
public class Singleton { private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton() { } public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } }
枚举模式 :自带序列化机制,绝对防止多次实例化,即使面对复杂的序列化或者反射攻击的时候。经常作为实现单例的最佳方法。不适合需要单例必须扩展超类的情况(参考 《Effective Java》)
public enum SingletonEnum { INSTANCE; void someMethod(){ System.out.println("这里是单例对象的方法!"); } }
语言是思想的载体

浙公网安备 33010602011771号