单例模式汇总

目录

 

 

单例模式汇总

一、单例模式的几种形式

二、具体代码实现

三、应用场景及各种形式的特点

四、小结


 

单例模式汇总

本文其中的内容大多是对我平时的阅读和实践的总结,希望对其他开发者有所帮助。但毕竟是个人的一些思考,难免有疏漏,也欢迎对本文的内容提出建议。

一、单例模式的几种形式

1、懒汉基本模式

2、懒汉线程安全模式

3、双重校验锁懒汉加载模式

4、饿汉模式

5、静态内部类单例模式

6、枚举类单例模式

常用的是双重校验锁懒汉加载模式、饿汉模式、静态内部类单例模式。

二、具体代码实现

1、懒汉基本模式

    public static LazySingle getmInstance1()
{
    if(mInstance==null)
    {
        mInstance = new LazySingle();
    }
    return  mInstance;
}

2、懒汉线程安全模式

    public static synchronized LazySingle getmInstance2()
{
    if(mInstance==null)
    {
        mInstance = new LazySingle();
    }
    return  mInstance;
}

3、双重校验锁懒汉加载模式

public static DoubleSingle getSinglon()
{
    if(singlon == null)
    {
        synchronized (DoubleSingle.class)
        {
            if(singlon==null)
            {
                singlon = new DoubleSingle();
            }
        }
    }
    return  singlon;
}

4、饿汉模式

public class HungrySingle {
    private static HungrySingle instance = new HungrySingle();
    private HungrySingle(){}
    public static HungrySingle getInstance()
    {
        return instance;
    }
}

5、静态内部类单例模式

public class InnerSingle {

    private static class SingletonHolder{
        private static final InnerSingle INSTANCE = new InnerSingle();
    }

    private InnerSingle(){}

    public static final InnerSingle getInstance()
    {
        return SingletonHolder.INSTANCE;
    }
}

6、枚举类单例模式

public enum MyEnumSingleton {
    INSTANCE;
    private void method(){
    }
}

三、应用场景及各种形式的特点

1、懒汉基本模式

仅适用于单线程的情形下

调用getInstance才会构造

没有调用不会构造

线程安全:否

构造函数添加参数:可以在getInstance添加参数,并传入到构造方法中

2、懒汉线程安全模式

适用于多线程的情形下,简单方便,但是效率稍低。

线程安全

3、双重校验锁懒汉加载模式

使用双重校验锁的形式,会在保证线程安全的情况下,提高性能

4、饿汉模式

有可能这个对象自始至终都不会被调用,那么采用此模式则会浪费内存

线程安全:是

构造函数添加参数:不支持,只能通过init方法进行参数的初始化

5、静态内部类单例模式

同样是属于懒加载的一种方法,利用了classloader的特性。

不支持构造方法传入参数,但可以通过Init方法来修改参数;

性能无损耗,线程安全

6、枚举类单例模式

较为新颖,较少使用

四、小结

针对不同场景采用不同的单例模式的形式有助于提高性能,比如某个对象会被频繁使用,那么可以考虑饿汉形式进行初始化对象,在使用该对象时就会减少初始化对象的时间;而如果该对象使用场景不多,或者基于启动性能的考虑,则可以使用双重校验锁懒汉加载模式;而如果使用的场景较简单,仅仅是工具软件,或者涉及到的多线程场景较少,则可以考虑懒汉线程安全模式。

猜你喜欢

转载自blog.csdn.net/u010375903/article/details/81240397