package com.bjsxt.cn.singleton; /** * 饿汉式创建单例模型 * 饿汉式单例模型的特点: * 1, 私有的该类对象静态属性 * 2, 私有的构造器 * 3, 公共的静态方法访问静态属性(因此需要时静态的环境) * @author wanna * */ public class SingletonDemo1 { //饿汉式,饿,非常饿,上来就吃了 //类初始化的时候,立即加载这个对象(没有延时加载的能力)。如果加载该类非常复杂,而在之后却又并没有访问该对象,造成资源的狼粪 //由于加载类是天然线程安全的,所以饿汉式单例模式线程安全 private static SingletonDemo1 instance = new SingletonDemo1(); private SingletonDemo1() { } //该访问方法没有同步synchronized,因此调用效率高 public static SingletonDemo1 getInstance() { return instance;
} }
package com.bjsxt.cn.singleton; /** * 2015年3月26日22:14:30 * 懒汉式单例模式 * 该懒汉式的特点是: * 1, 构造器私有 * 2, 私有静态属性,类型为该类的对象,但是在声明时并没有初始化。因为Lazy load。因为懒惰 * 3, 静态访问私有的那个静态属性的静态方法。但是在该方法体中先要检查该静态属性是否为空,为空则new,否则直接返回 * * @author wanna * */ public class SingletonDemo2 { private SingletonDemo2() { } private static SingletonDemo2 instance; //因为该方法加了同步synchronized,效率低,但是具有延时加载的能力。提高了资源的利用率 public static synchronized SingletonDemo2 getInstance() { if (instance == null) { instance = new SingletonDemo2(); } return instance; } }
package com.bjsxt.cn.singleton; /** * 2015年3月26日22:14:38 * * 测试双重检测锁式单例模式 * 双重检测锁式单例模式的特点与懒汉式相似,但最重要的区别是在访问静态属性的实例时的过程 * * 但是由于编译器底层优化和JVM内部模型,偶尔会出问题,不建议使用 * @author wanna * */ public class SingletonDemo3 { private static SingletonDemo3 instance = null; private SingletonDemo3() { } //该方法把懒汉式单例模式中的synchronized同步下移到if中,提高了执行效率,不用每次获取对象时都需要进行同步。 //只有第一次创建需要同步,之后就不需要了。 public static SingletonDemo3 getInstance() { if (instance == null) { SingletonDemo3 sc; synchronized(SingletonDemo3.class) { sc = instance; if (sc == null) { synchronized(SingletonDemo3.class) { if (sc == null) { sc = new SingletonDemo3(); } } instance = sc; } } } return instance; } }
package com.bjsxt.cn.singleton; /** * 2015年3月26日22:14:45 * 静态内部类实现单例模式 * 这种方式线程安全,执行效率高,并且可以延时加载 * 特点: * 1, 构造器私有 * 2, 静态属性修改为静态内部类,在内部类中定义了外部类的静态final属性(好像删去final也不影响) * 3, 静态访问静态属性的方法,在方法体重返回在内部类new出来的外部封装类对象。也就实现了延时加载 * @author wanna * */ public class SingletonDemo4 {
private static class SingltonClassInstance { private static SingletonDemo4 instance = new SingletonDemo4(); } public static SingletonDemo4 getInstance() { return SingltonClassInstance.instance; } private SingletonDemo4() { } }
package com.bjsxt.cn.singleton;
/** * 测试枚举实现单例模式(没有延时加载) * @author wanna * */ public enum SingletonDemo5 { Instance;//该枚举元素本身就是单例对象 //添加自己需要的操作 public void operation() { } }
原文:http://blog.csdn.net/lk142500/article/details/44657951