X1-1-单例模式

总目录:地址如下看总纲

https://www.jianshu.com/p/63df8cd03619

1、饿汉模式:顾名思义,因为饿了,就勤快

设计思路:实例在初始化的时候就已经建好了,所以类加载较慢,但获取对象的速度快。好处是没有线程安全的问题(基于类加载机制),坏处是浪费内存空间,这时候初始化instance显然没有达到懒加载的效果。


    public class Singleton {
        private static Singleton instance = new Singleton ( );

        private Singleton() {
        }

        public static Singleton getInstance() {
            return instance;
        }
    }

补充:


X1-1-单例模式_第1张图片
image.png

2、懒汉模式(线程不安全)

设计思路:“比较懒”(用的时候才去检查有没有实例,如果有则返回,没有则新建),懒汉模式声明了一个静态对象,在用户第一次调用时初始化,虽然节约了资源,但第一次加载时需要实例化,反映稍慢一些,而且在多线程不能正常工作。


 public class Singleton {
        private static Singleton instance;

        private Singleton() {
        }

        public static Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton ( );
            }
            return instance;
        }
    } 

3、懒汉模式(线程不安全),加了synchronized 修饰


 public class Singleton {
        private static Singleton instance;

        private Singleton() {
        }

        public static synchronized   Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton ( );
            }
            return instance;
        }
    } 

4、双重检查模式 (DCL):资源利用率高

设计思路:
1、此写法在getSingleton方法中对singleton进行了两次判空,第一次是为了不必要的同步,第二次是在singleton等于null的情况下才创建实例。volatile关键字考虑了程序的正确性,但多少会影响性能。
2、某些情况会出现失效的问题,也就是DCL失效,在《java并发编程实践》一书建议用静态内部类单例模式来替代DCL。

  public class Singleton {
        private volatile static Singleton instance;

        private Singleton() {
        }

        public static Singleton getInstance() {
            if (instance == null) {
                synchronized (Singleton.class) {
                    if (instance == null) {
                        instance = new Singleton ( );
                    }
                }
            }
            return instance;
        }
    }

5、静态内部类单例模式

设计思路:
第一次加载Singleton类时并不会初始化sInstance,只有第一次调用getInstance方法时虚拟机加载SingletonHolder 并初始化sInstance ,这样不仅能确保线程安全也能保证Singleton类的唯一性,所以推荐使用静态内部类单例模式。


   public class Singleton {
        private Singleton() {
        }

        public static Singleton getInstance() {
            return SingletonHolder.sInstance;
        }

        private static class SingletonHolder {
            private static final Singleton sInstance = new Singleton ( );
        }
    }

6、枚举单例

设计思路:
1、默认枚举实例的创建是线程安全的,并且在任何情况下都是单例。不过上面的五种方式,有一种情况下他们会重新创建对象,那就是反序列化,将一个单例实例对象写到磁盘(或者内存)再读回来,从而获得了一个实例。反序列化操作提供了readResolve方法,这个方法可以让开发人员控制对象的反序列化。在上述的几个方法示例中如果要杜绝单例对象被反序列化是重新生成对象。


    public enum Singleton {
        INSTANCE;

        public void doSomeThing() {
        }
    }

    异常五种防止破坏单例的机制
    private Object readResolve() throws ObjectStreamException {
        return singleton;
    }

补充:


X1-1-单例模式_第2张图片
image.png

X1-1-单例模式_第3张图片
image.png

参考博客:

https://www.cnblogs.com/xz816111/p/8470048.html

https://blog.csdn.net/itachi85/article/details/50510124?utm_medium

https://blog.csdn.net/huangbiao86/article/details/6896565

https://blog.csdn.net/u010002184/article/details/90748963

https://www.hollischuang.com/archives/2498

//韩顺平的设计模式

你可能感兴趣的:(X1-1-单例模式)