设计模式之单例模式
为什么使用单例模式
对于频繁创建和销毁对象,创建时耗时过多或耗费资源过多(即:重量级对象),
但又经常用到的对象工具类对象,频繁访问数据库或文件的对象(如:数据源,session工厂等)
饿汉式
简单
稍微占用一些内存不过影响不大,如果确定这个实例一定会用到那就没有任何问题 可用
public class Singleton{ private static Singleton INSTANCE = new Singleton(); private Singleton(){} public static Singleton getSingleton(){ return INSTANCE; } }
线程安全懒汉式 效率低 不推荐
public class Singleton{ private static Singleton INSTANCE; private Singleton(){} public static synchronized Singleton getSingleton(){ if(INSTANCE = null){
INSTANCE = new Singleton();
}
return INSTANCE; } }
懒汉式双重检查
同时解决了效率问题,而且实现了懒加载 可用
public class Singleton{ private static volatile Singleton INSTANCE; private Singleton(){} public static Singleton getSingleton(){ if(INSTANCE = null){ synchronized(Singleton.class){
if(INSTANCE = null){
INSTANCE = new Singleton();
}
}
} return INSTANCE; } }
静态内部类方法
实现了懒加载,同时保证线程安全,JVM加载类的时候只加载一次,因此永远只有一个对象 完美的写法
pubic class Singleton{ private Singleton(){} private static class SingletonHolder{ private final static Singleton INSTANCE = new Singleton(); } public static Singleton getSingleton(){ return SingletonHolder.INSTANCE; } }
枚举法
最完美的写法 Effect Java作者Josh Bloch提倡的方式
不仅能避免多线程同步的问题,而且还能防止反序列化重新创建新的对象
public enum Singleton{ INSTANCE; public void method(){} }