单例模式懒汉与饿汉

懒汉:在初始化类的时候,不创建唯一的实例,而是等到真正需要用到的时候才创建。必须加上同步,否则有可能依然创建多个实例。
饿汉:在初始化的时候,就创建了唯一的实例,不管是否需要用到。不需要自己加同步,一定产生唯一的实例。

懒汉代码
public class Singleton
{
    // 私有的、静态的成员保存唯一的实例
    private static Singleton inst;
    // 私有构造器,避免被别人创建实例
    private Singleton(){}

    // 提供一个公共的、静态的方法,获取唯一的实例
    public static Singleton getInstance()
    {
        // 很多示例代码都是在方法上加同步,但是基于“最小范围原则”,应该要用同步代码块
        // 这样可以尽可能提升程序的并发性能
        synchronized( Singleton.class )
        {
            // 判断inst是否为null,如果是null则新建一个
            if( inst == null )
            {
                inst = new Singleton();
            }
        }
        return inst;
    }
}


饿汉代码
public class Singleton
{
    // 私有的、静态的成员保存唯一的实例
    // 在类被第一次使用的时候,就已经完成了加载。类的加载过程,系统保证线程安全。
    private static Singleton inst = new Singleton();
    // 私有构造器,避免被别人创建实例
    private Singleton(){}

    // 提供一个公共的、静态的方法,获取唯一的实例
    public static Singleton getInstance()
    {
        return inst;
    }
}


从上面两个代码来看,由于懒汉模式下,每次获取实例都需要判断,如果使用非常频繁的时候,这种方式性能肯定有所下降。

因此懒汉模式下,不适合使用太频繁的对象。

饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变


而在饿汉模式下,不管是否用到,都会初始化实例。
这种是我比较推荐的做法:因为不使用对象的类,就不需要单例模式!既然需要用到对象,为何不在一开始就初始化好?

猜你喜欢

转载自blog.csdn.net/qq_34207444/article/details/79341334