赞
踩
日头没有辜负我们,我们也切莫辜负日头。——沈从文
代码世界中也存在以下顺口溜:
我单身,我骄傲,我为国家省套套。
我单身,我自豪,我为祖国省橡胶。
单例模式虽然简单,但真正懂的内行的人并不多,今天挑战全网最全的经典设计模式之单例模式。
定义
确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。
隐藏其构造方法
属于创建型设计模式
适用场景
确保任何情况下都绝对只有一个实例
ServletContext、ServletConfig、ApplicationContext、DBPool
定义
系统初始化的时候就加载,不管有没有用到这个单例。
优点
执行效率高,性能高,没有任何的锁
缺点
某些情况下,可能会造成内存浪费
能够被反射破坏
代码
public class HungrySingleton {
private static final HungrySingleton singleton = new HungrySingleton();
private HungrySingleton(){
}
public static HungrySingleton getInstance() {
return singleton;
}
}
定义
系统初始化的时候不创建实例,只有用到的时候才创建实例。
优点
节省了内存
缺点
synchronized造成性能低下
能够被反射破坏
代码
public class LazySingleton { private static LazySingleton singleton = null; private LazySingleton(){ } /** * 版本1 * @return */ public static synchronized LazySingleton getInstance() { if (null == singleton) { singleton = new LazySingleton(); } return singleton; } }
代码
public class LazySingleton { private static LazySingleton singleton = null; private LazySingleton(){ } /** * 版本2 相比版本1优化一点点 * @return */ public static LazySingleton getInstance() { synchronized (LazySingleton.class) { if (null == singleton) { singleton = new LazySingleton(); } } return singleton; } }
陷阱案例
public class LazySingleton { private static LazySingleton singleton = null; private LazySingleton(){ } /** * 版本3 双重判断 * @return */ public static LazySingleton getInstance() { if (null == singleton) { synchronized (LazySingleton.class) { if (null == singleton)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。