单例模式,最好的单例实现方式,静态内部类的方式

单例模式的优点:

    1.在内存中只有一个对象,节约内存
    2.避免频繁的创建和销毁对象,可以提高性能
    3.避免对共享资源的多重占用
    4.可以全局访问

适用场景:

    1.需要频繁实例化然后销毁的对象
    2.创建对象时,耗时过多或者耗资源过多,但又经常用到的对象
    3.有状态的工具类对象
    4.频繁访问数据库或文件的对象
    5.要求只有一个对象的场景

静态内部类的方式实现单例

/*
 * 单例模式,确保一个类只有一个实例,而且自动实例化,并向整个系统提供整个实例。
 * 三个优点
 * 1.jvm虚拟机本身的机制,保证了数据的线程安全
 * 2.没有使用关键字,synchronized,虽然这个关键字能保证线程安全,但是他非常的影响性能,
 * 因为他只有一个线程能读取里面的数据,另一个线程就不能读取,静态内部类的方式,可以同时读取
 * jvm本身的机制保证了线程安全,没有性能缺陷
 * 3.SingletonHolder类是私有的,只有getInstance()能对其进行访问
 */

/*
 * 第一次加载这个StaticInnerSingleton的时候,他不会初始化instance, 只有他第一次调用 getInstance()
 * 这个方法之后,虚拟机才会加载SingletonHolder类, 并初始化instance,这样不仅能保证线程安全,也能保证single类的唯一性。
 */


/**
    // 静态内部类
 * jvm提供的同步控制 static final static 区块初始化数据,保证数据在内存中是独一份的 final
 * 变量初始化完成之后就无法被修改,所以final也是线程安全的
 *
 * 我们利用的是jvm进行类加载的时候会保证数据同步,所以我们就利用内部类原理,
 * 在内部类里创建对象的实例,这样只要我们的应用中不使用这个内部类StaticInnerSingleton,
 * 那么jvm虚拟机他就不会去加载这个类,也就不会去创建我们所要创建的单例对象Instance,从而
 * 这里静态内部类,就完成了懒汉式的延迟加载,同时又保证了线程安全
 */

public class StaticInnerSingleton {
    private StaticInnerSingleton() {
    }

    public static StaticInnerSingleton getInstance() {
        return SingletonHolder.mInstance;
    }

    private static class SingletonHolder {
        private static final StaticInnerSingleton mInstance = new StaticInnerSingleton();
    }
}

猜你喜欢

转载自blog.csdn.net/yu540135101/article/details/83344490
今日推荐