首页 > 代码库 > 设计模式-单例模式总结

设计模式-单例模式总结

五中单例模式总结,具体使用哪个需要根据实际情况具体分析,比如需要使用单例模式的资源大小确定是否需要延迟加载,需要延迟加载时推荐使用静态内部类,不需要延迟加载时推荐使用枚举类或者饿汉式

 1 /**
 2  * 饿汉式
 3  * 类初始化时,立即加载这个对象  
 4  * 不能延时加载
 5  * 线程安全,调用效率高
 6  * @author bao
 7  *2017年4月9日 22:27:28
 8  */
 9 public class SingletonDemo1 {
10      
11     private static SingletonDemo1  single= new SingletonDemo1();
12     
13     private SingletonDemo1(){
14         
15     }
16     public static SingletonDemo1 getSingleton(){
17         return single;
18     }
19 }
/**
 * 懒汉式
 * 类初始化时,不创建对象(延时加载,用的时候在创建
 * 
 * 方法同步,调用效率低,
 * @author bao
 *
 */
public class SingletonDemo2 {

    private static SingletonDemo2 single;

    private SingletonDemo2() {

    }

    public static synchronized SingletonDemo2 getInstance() {

        if (single == null) {
            single =  new SingletonDemo2();
        }
        return single;
    }
}
/**
 * 双重检查锁
 * 
 * 由于虚拟机优化等问题(暂时没搞明白原因),会将两个同步快进行颠倒,会出问题
 * @author bao
 *
 */
public class SingletonDemo3 {

    private static SingletonDemo3 single = null;
    
    public static SingletonDemo3 getInstance(){
        if(single == null){
            SingletonDemo3 instance;
            synchronized(SingletonDemo3.class){
                instance = single;
                if(instance ==null){
                    synchronized(SingletonDemo3.class){
                        if(instance == null){
                            instance=new SingletonDemo3();
                        }
                    }
                    single = instance;
                }
            }
        }
        return single;
    }
}

 

/*
 * 静态内部类实现,很多框架都是使用的此单例
 * 静态内部类不是外部类的静态属性,所以不会像饿汉式一样立即加载对象
 * 
 * 只有调用getInstance()时,才会加载静态内部类,加载类时线程时安全的,single时static final 类型
 * 保证 了内存中只有唯一一个实例存在,而且只能被赋值一次,从而保证线程安全性;
 * 
 * 具有并发高效调用和延迟加载的优势
 */
public class SingletonDemo4 {

    private SingletonDemo4() {
    }

    // final修饰关键字可以加,也可以不加
    private static class SingletonClassInstance {
        private static final SingletonDemo4 single = new SingletonDemo4();
    }

    public static SingletonDemo4 getInstance() {
        return SingletonClassInstance.single;
    }
}

 

 

/**
 * 枚举类实现单例模式
 * 优点:先天就是单例模式
 * 缺点:不能实现延迟加载
 * @author bao
 */
public enum SingletonDemo5 {
    INSTANCE;
}

------------------下面则测试单例模式的效率-------------------------------------------------------------------------------------------------------------------------------------------------------------

 

设计模式-单例模式总结