目录
单例模式汇总
本文其中的内容大多是对我平时的阅读和实践的总结,希望对其他开发者有所帮助。但毕竟是个人的一些思考,难免有疏漏,也欢迎对本文的内容提出建议。
一、单例模式的几种形式
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、枚举类单例模式
较为新颖,较少使用
四、小结
针对不同场景采用不同的单例模式的形式有助于提高性能,比如某个对象会被频繁使用,那么可以考虑饿汉形式进行初始化对象,在使用该对象时就会减少初始化对象的时间;而如果该对象使用场景不多,或者基于启动性能的考虑,则可以使用双重校验锁懒汉加载模式;而如果使用的场景较简单,仅仅是工具软件,或者涉及到的多线程场景较少,则可以考虑懒汉线程安全模式。