标签:
public class SingletonDemo01 { /** * 加载时就把对象创建出来--饿汉式 * 类初始化时天然的是线程安全的 */ private static SingletonDemo01 instance=new SingletonDemo01(); private SingletonDemo01(){ } //方法没有同步,调用效率高 public static SingletonDemo01 getInstance(){ return instance; } }
public class SingletonDemo02 { /** * 加载时就不把对象创建出来--懒汉式 * 类初始化时天然的是线程安全的 */ private static SingletonDemo02 instance; private SingletonDemo02(){ } //方法同步,并发效率低(如果不同步,并发量高的时候可能创建多个对象) public static synchronized SingletonDemo02 getInstance(){ if(instance==null){ instance=new SingletonDemo02(); } return instance; } }
public class SingletonDemo03 { private static SingletonDemo03 instance=null; private SingletonDemo03(){ } public static SingletonDemo03 getInstance(){ if(instance==null){ SingletonDemo03 ins; synchronized (SingletonDemo03.class) { ins=instance; if(ins==null){ synchronized (SingletonDemo03.class) { if(ins==null){ ins=new SingletonDemo03(); } } instance=ins; } } } return instance; } }
public class SingletonDemo04 { private SingletonDemo04(){ } //类加载的方式天然线程安全 private static class Singleton04ClassInStance{ //不存在同步问题,效率高 private static final SingletonDemo04 instance=new SingletonDemo04(); } //调用的时候才去加载,延迟加载实现 public static SingletonDemo04 getInstance(){ return Singleton04ClassInStance.instance; } }
public enum SingletonDemo05 { /** * 这个枚举元素本身就是单例 */ INSTANCE; /** * 还可以添加自己需要的操作 */ public void singletonOpt(){ } }
--主要:
① 饿汉式:线程安全,调用效率高,不可以延迟加载
② 懒汉式:线程安全,调用效率不高,可以延迟加载
-- 其他:
③ 双重锁:JVM底层内部模型原因,偶尔会出问题,不建议使用
④ 静态内部类:线程安全,调用效率高,可以延迟加载
⑤ 枚举式:线程安全,调用效率高,不可延迟加载。并且可以天然的防止反射和反序列化漏洞。
标签:
原文地址:http://www.cnblogs.com/jeyson/p/5888063.html