码迷,mamicode.com
首页 > 其他好文 > 详细

单例模式

时间:2017-04-14 10:03:35      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:private   静态代码块   singleton   ack   class   spring   ret   判断   变量   

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

    }

}

单例模式

标签:private   静态代码块   singleton   ack   class   spring   ret   判断   变量   

原文地址:http://www.cnblogs.com/hawk-whu/p/6706977.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!