五中单例模式总结,具体使用哪个需要根据实际情况具体分析,比如需要使用单例模式的资源大小确定是否需要延迟加载,需要延迟加载时推荐使用静态内部类,不需要延迟加载时推荐使用枚举类或者饿汉式
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; }
------------------下面则测试单例模式的效率-------------------------------------------------------------------------------------------------------------------------------------------------------------
时间: 2024-11-05 06:03:31