首页 > 代码库 > 单例模式

单例模式

     单例模式,作为一种常用,且在很多框架中非常常用的模式,比如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

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

<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #4e9072 } p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #3933ff } span.s1 { color: #931a68 } span.s2 { color: #0326cc } span.s3 { color: #000000 } span.s4 { color: #7e504f }</style>

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;

    }

}

<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #4e9072 } p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #3933ff } span.s1 { color: #931a68 } span.s2 { color: #000000 } span.s3 { color: #0326cc } span.s4 { color: #7e504f }</style>

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;

    }

}

单例模式