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

05 单例模式

时间:2019-10-11 12:57:00      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:==   turn   方法   异常   stat   加载   let   初始   排序   

单例模式

1、饿汉式

public class HungerySingleton {

    private HungerySingleton() {};
    
    private static HungerySingleton instance=new HungerySingleton();
    
    public static HungerySingleton getInstance() {
        return instance;
    }
}

在加载的时候已经被实例化,只有一次,线程安全

但如果一直不使用,占用资源

2、 懒汉式

  • 2.1 synchronized实现懒汉式

    由于使用了synchronized时代码退化为串行执行
    public class HoonSingleton {

    private HoonSingleton() {};
    
    private static HoonSingleton instance;
    
    public synchronized static HoonSingleton getInstance() {
        if (null==instance) {
            instance=new HoonSingleton();
        }
        return instance;
    }
}
    
  • 2.2 使用DCL(double-checked-locking)实现懒汉式

    在构造方法中进行成员变量赋值时,如果代码进行了重排序,可能导致空指针异常
public class DCLSingleton {

    private DCLSingleton() {};
    
    private volatile static DCLSingleton instance=null;
    
    public static DCLSingleton getInstance() {
        if (null==instance) {
            synchronized (DCLSingleton.class) {
                if (null==instance) {
                    instance=new DCLSingleton();
                }
            }
        }
        return instance;
    }
}
  • 2.3 使用内部类实现懒汉式

public class HolderSingleton {
    
    private HolderSingleton() {};
    
    //原理:内部类在加载的时候不会初始化内部的变量,只有在用到的时候才会进行初始化,而且由jvm保证了线程安全
    private static class Holder{
        
        private static HolderSingleton instance=new HolderSingleton();
    }
    
    public static HolderSingleton getInstance() {
        return Holder.instance;
    }
}
  • 2.4 使用枚举实现饿汉式

public enum EnumSingleton {

    //枚举有类加载后就直接初始化,相对于饿汉式
    INSTANCE;
    
    public static EnumSingleton getInstance() {
        return INSTANCE;
    }
}
  • 2.5 使用枚举内部类实现懒汉式

public class EnumHolderSingleton {
    
    private EnumHolderSingleton() {}
    
    public static EnumHolderSingleton getInstance() {
        return EnumHolder.instance;
    }
    
    //依靠内部类延迟加载的功能实现懒汉式单例
    private enum EnumHolder{
        INSTANCE;
        private static EnumHolderSingleton instance=new EnumHolderSingleton();
    }
}

05 单例模式

标签:==   turn   方法   异常   stat   加载   let   初始   排序   

原文地址:https://www.cnblogs.com/lifeone/p/11653140.html

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