设计模式|单例模式(1)
概念
-
定义:保证一个类仅有一个实例,并提供一个全局访问点
-
类型:创建型
-
适用场景
- 想确保任何情况下都绝对使用同一个情况
-
优点
- 减少内存开销
- 避免对资源的多从占用
- 设置全局访问点,严格控制访问
-
缺点
- 没有接口,扩展比较难
案例
懒汉式
/**
* @ClassName 懒汉式单例模式:延迟加载
* @Description TODO
* @Author dsdj
* @Date 2018/10/22 下午8:15
* @Version 1.0
**/
public class LazySingleton {
private static LazySingleton lazySingleton = null;
private LazySingleton(){
// 构造函数一定为私有的,防止外部new
}
public static LazySingleton getInstance(){
if (lazySingleton == null){
lazySingleton = new LazySingleton();
}
return lazySingleton;
}
}
缺点:懒汉式注重延迟加载,在使用时才进行创建。这存在线程安全的问题——— 当一个线程调用getInstance()时还没new好对象时,另一个也调用发现lazySingleton为空,也进行创建对象,这就出现了线程不安全的问题。
解决方法
- getInstance变为同步方法
public synchronized static LazySingleton getInstance(){
if (lazySingleton == null){
lazySingleton = new LazySingleton();
}
return lazySingleton;
}
缺点:解决了线程安全的问题了,但是同步锁是对静态方法进行上锁,即对class类进行上锁了,范围太大了。对性能下降
DoubleCheck双重检查
public class LazySingleton {
private static LazySingleton lazySingleton = null;
private LazySingleton(){
// 构造函数一定为私有的,防止外部new
}
public static LazySingleton getInstance(){
if (lazySingleton == null){
synchronized(LazySingleton.class){
if (lazySingleton == null){
lazySingleton = new LazySingleton();
}
}
}
return lazySingleton;
}
}
静态内部类
public class StaticInnerClassSingleton {
private static class InnerClass{
private static StaticInnerClassSingleton staticInnerClassSingleton;
}
public static StaticInnerClassSingleton getInstance(){
return InnerClass.staticInnerClassSingleton;
}
}
原理:jvm在类的初始化的时候会获取一个锁,这个锁会同步多个线程对一个类的初始化。