标签:可见性 http 内存 漏洞 lazy .com on() 加载 高效
因此可以省略synchronized关键字
public class SingletonDemo1 { //类初始化时,立即加载这个对象(没有延时加载的优势),,记载类时,天然的是线程安全的 private static SingletonDemo1 instance = new SingletonDemo1(); private SingletonDemo1(){ }; //方法没有同步,效率高 public static SingletonDemo1 getInstance(){ return instance; } }
public class SingletonDemo2 { //类初始化时,不初始化这个对象,(延时加载,真正用到的时候再创建) private static SingletonDemo2 instance ; private SingletonDemo2(){ }; //方法同步,效率低 public static synchronized SingletonDemo2 getInstance(){ if(instance==null){ instance= new SingletonDemo2(); } return instance; } }
public class Singleton { private volatile static Singleton sSingleton; private Singleton() { } public static Singleton getSingleton() { if (sSingleton == null) { synchronized (Singleton.class) { if (sSingleton == null) { sSingleton = new Singleton(); } } } return sSingleton; } }
public class SingletonDemo3 { private static class SingletonClassInstance{ private static final SingletonDemo3 instance = new SingletonDemo3() ; } private SingletonDemo3(){ } public static SingletonDemo3 getInstance(){ return SingletonClassInstance.instance; } }
public enum SingletonDemo4 { //枚举元素本身就是单例对象 INSTANCE; //添加自己需要的操作 public void singletonOperation(){ } }
-------可以通过定义readResolve()防止获得不同对象。
--------反序列化时,如果对象所在类定义了readResolve(),定义返回哪个对象,实际是一种回调。
public class SingletonDemo5 { //类初始化时,不初始化这个对象,(延时加载,真正用到的时候再创建) private static SingletonDemo5 instance ; private SingletonDemo5(){ if(instance !=null){ throw new RuntimeException(); } } //方法同步,效率低 public static synchronized SingletonDemo5 getInstance(){ if(instance==null){ instance= new SingletonDemo5(); } return instance; } //反序列化时,如果定义了readResolve(),则直接返回此方法指定的对象,而不需要单独创建新的对象 private Object readResolve(){ return instance; } }
单例对象占用资源少,不需要延时加载 -------枚举类好于饿汉式
单例对象占用资源大,需要延时加载 -------静态内部类好于懒汉式
标签:可见性 http 内存 漏洞 lazy .com on() 加载 高效
原文地址:http://www.cnblogs.com/qingdaofu/p/7465910.html