当前位置: 移动技术网 > IT编程>开发语言>Java > Java设计模式---单例模式

Java设计模式---单例模式

2018年11月27日  | 移动技术网IT编程  | 我要评论

参考于 :

  大话设计模式

  java三百集---高淇

  

  讲在开头:如果需要懒加载,推荐使用静态内部类实现

       如果不需要懒加载,推荐使用枚举  

1.单例模式的概念

  保证一个类仅有一个实例,并提供一个访问它的全局访问点。

  你可能会想,我在创建对象的时候,先判断是不是null,不是null就直接获得,是null就创建实例。

  “生孩子还是不生孩子”应该是夫妻的责任,而不是我的责任。如果按照上面的想法,那么我就需要先判断一下才可以,这样“能不能生”就成了我的责任了哦。

  我们把“生一个孩子”的责任交给类,我们只需要去获得就完事了。

  

 2.第一种实现---饿汉式

  jvm加载类的时候先实例化了

  优点:jvm加载类是线程安全

  缺点:不能懒加载

  

package com.dingyu;

/**
 * 饿汉式单例模式 ,效率高
 * 线程安全,不需要synchronized关键字,但是不能懒加载
 * @author dingyu
 *
 */
public class singleton01 {
    private static singleton01 instance = new singleton01();

    private singleton01() {
        
    }
    
    public static singleton01 getsingleton() {
        return instance;
    }
}

 3.第二种实现---懒汉式

  调用方法的时候再去创建实例

  优点:懒加载

  缺点:需要同步(不同步,如果线程a,线程b同时调用getsingleton(),相当于new了两次),效率不高

  

package com.dingyu;
/**
 * 懒汉式单例模式
 * 优点:懒加载
 * 缺点:需要同步
 * @author dingyu
 *
 */
public class singleton02 {
    private static singleton02 instance = null;

    private singleton02() {

    }

    private static synchronized singleton02 getsingleton() {
        if (instance == null)
            instance = new singleton02();
        return instance;
    }
}

 4.第三种实现---双重锁定(尽量别用)

  如果第一次获得就加锁,创建。其他的时候就直接返回就可以。

  优点:效率高,可以懒加载

  缺点: jvm内部的原因会出现不可预知的错误(本人还没去了解原因,如果有知道的可以告诉我下,感谢)

  为什么要判断两次null,大话设计模式中解释了:如果线程a,线程b,通过突破了第一层null,线程a获得锁,线程b等着。a创建了个实例,释放锁,b获得锁,继续运行,如果没有第二层null,那么b仍然会创建一个实例,破坏单例模式。

package com.dingyu;

/**
 * 双重检测锁实现单例模式
 * 
 * @author dingyu
 *
 */
public class singleton03 {
    private static singleton03 instance = null;

    private singleton03() {

    }

    public static singleton03 getsingleton() {
        if (instance == null) {
            synchronized (singleton03.class) {
                if (instance == null) {
                    instance = new singleton03();
                }
            }
        }
        return instance;
    }
}

 5.第四种实现---静态内部类(推荐)

  静态内部类是你用到他的时候,他才会加载,而且加载类的时候是线程安全的,不需要同步

  优点:懒加载,效率高

package com.dingyu;
/**
 * 静态内部类实现单例模式
 * @author dingyu
 *
 */
public class singleton04 {
    private singleton04() {

    }

    private static class singletoninnerclass {
        private static singleton04 instance = new singleton04();
    }

    private static singleton04 getsingleton() {
        return singletoninnerclass.instance;
    }
}

 6.第五种实现---枚举(推荐)

  枚举很特殊,jvm帮我们实现的单例,天然是单例的

  优点:效率高,反射破解不了

  缺点:不能懒加载

  

package com.dingyu;

/**
 * 枚举实现单例 枚举本来就是单例的
 * 
 * @author dingyu
 *
 */
public enum singleton05 {
    instance;
}

 

  

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网