五种常见的单例模式及其效率测试

版权声明:转载附链接并联系 https://blog.csdn.net/BigCabbageFy/article/details/79778960

所谓单例模式就是不管你此时new多少新对象,它只会创建出一个对象供你使用。
最基础的两种单例模式是:饿汉式和懒汉式。
而还有三种常见的单例模式:双重检测锁模式、静态内部类实现和枚举类实现模式。


懒汉式:

    /**

     * 测试懒汉式单例模式

     * 延时加载,用到了才创建对象,提高了资源的利用率。

     * 但由于需要用到同步,导致并发效率很低。

     * @author Administrator


     */

public class SingletonDemo2 {

    private static SingletonDemo2 s2;

    //构造器私有化
    private SingletonDemo2() {
    }

    //这里要加上同步,否则不能实现单例
    public static synchronized SingletonDemo2 getInstance() {

        //判断s2是否为空,如果为空,则创建一个新对象。
        if(s2 == null) {
            s2 = new SingletonDemo2();
        }

        return s2;

    }
}

饿汉式:

/**

 * 测试饿汉单例模式

 * 饿汉式单例模式无延时加载。

 * @author Administrator

 */

public class SingletonDemo1 {

    //在创建对象的时候用类加载器初始化, 
    //类加载器在加载的时候是一个天然的线程安全
    //不需要用保持同步来保证线程安全

    private static SingletonDemo1 instanc = new SingletonDemo1();

    private SingletonDemo1(){
    }
    //随用随加载,无延时
    public static SingletonDemo1 getInstanc() {
        return instanc;
    }
}

双重检测锁:
-由于JVM底层内部模型原因,偶尔会出问题,不建议使用。所以相应代码不在这里显示了。

静态内部类实现:

/**
 * 测试静态内部类实现方式
 * 延迟加载
 * 线程安全
 * 并发高效调用
 * @author Administrator
 */
public class SingletonDemo3 {

    //静态内部类,并私有化
    private static class SingletonDemo3ClassInstance{
        private static SingletonDemo3 instance = new SingletonDemo3();
    }
    //没有同步,调用效率高
    public static SingletonDemo3 getinstance() {
        return SingletonDemo3ClassInstance.instance;
    }

    private SingletonDemo3(){
    }
}

枚举类:

/**
 * 枚举式实现单例模式
 * 线程安全
 * 防止反射和反序列化操作破解
 * 无延时加载
 * @author Administrator
 */
 public enum SingletonDemo4 {
     //枚举元素是天然的线程安全
     INSTANCE;
}

总结如下:

常见的五种单例模式实现方式
主要:
    -饿汉式(线程安全,调用效率高;但是不能延时加载)
    -懒汉式(线程安全,调用效率不高,但是可以延时加载)
其他:
    -双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题,不建议使用)
    -静态内部类式(线程安全,调用效率高,但是,可以延时加载)
    -枚举类(线程安全,调用效率高,防反射和反序列化,不能延时加载)

如何选用?
-单例对象 占用资源少,不需要延时加载时:
    枚举类  好于 饿汉式
-单例对象 占用资源大,需要延时加载时:
    静态内部类式 好于 懒汉式

五种方式效率测试:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/BigCabbageFy/article/details/79778960