单例模式

Posted 鹰搏长空08

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式相关的知识,希望对你有一定的参考价值。

     单例模式,作为一种常用,且在很多框架中非常常用的模式,比如springMVC中默认的就是用单例。

     今天就来讲讲单例模式都有哪些,以及有何区别,有何优点缺点。

    1. 饿汉模式,顾名思议,即是提前把这个单例给好了。优:线程安全;缺:初始加载,不管有用没有;

    2. 懒加载,分好几种。是不是该加点代码的,最后我会将我github地址给出。

        a.  在返回实例接口中,判断为空则new。缺点:非线性安全;

        b.  对返回实例接口作同步,加synchronized关键字,保证线性安全。缺点:效率不高。同步大篇代码块同样问题;

        c.  对new操作加synchroized关键字保证new操作线程安全。缺点:保证不了单例;

        d.  在c的基础上再加一层if null 判断,即双重检查锁DCL。

    3. 静态内部类。优点:实现延迟加载,线程安全。感觉这个挺nice,在真实上亿级pv项目中使用过。对了,这里有个如果在序列化场景中,反序列化会

出现多例,可通过readResolve解决;

    4. 静态代码块,这个感觉不到与饿汉模式有啥区别,有懂的请留言,谢谢!!!

    5. 枚举,利用枚举是内部构造函数特点,只定义一个枚举变量,有暴露和隐藏式两种(PS:名字是我自己想的),前者会暴露枚举,后者不会。

 

说了那多代码呢,在这:https://github.com/wdmyong/singleton

不想去的朋友们,我这里也贴两个。

package com.wdm.singleton.impl;

 

/*

 * 饿汉模式,声明的时候就初始化了。

 */

public class HungrySingleton {

 

    private static HungrySingleton instance = new HungrySingleton();

 

    private String name;

 

    private HungrySingleton() {

        this.name = "HungrySingleton";

    }

 

    public static HungrySingleton getInstance() {

        return instance;

    }

 

    public String getName() {

        return name;

    }

 

    public void setName(String name) {

        this.name = name;

    }

}

package com.wdm.singleton.impl;

 

/*

 * 静态内部类,由于采用了静态内部类保证了延迟加载,同时采用静态变量保证线程安全

 */

public class StaticInnerClassSingleton {

 

    private static class StaticInnerClassSingletonHolder {

        // final修饰符是必要的么,mark一下

        private static final StaticInnerClassSingleton instance = new StaticInnerClassSingleton();

    }

 

    private String name;

 

    private StaticInnerClassSingleton() {

        this.name = "StaticInnerClassSingleton";

    }

 

    public static StaticInnerClassSingleton getInstance() {

        return StaticInnerClassSingletonHolder.instance;

    }

 

    public String getName() {

        return name;

    }

 

    public void setName(String name) {

        this.name = name;

    }

}

以上是关于单例模式的主要内容,如果未能解决你的问题,请参考以下文章

单例模式(单例设计模式)详解

Java模式设计之单例模式(二)

单例模式(饿汉式单例模式与懒汉式单例模式)

单例模式

单例模式

设计模式之单例模式