zoukankan      html  css  js  c++  java
  • 移动架构-单例模式

    单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例

    饿汉式

    先初始化对象,类在加载内存时候创建对象

    public class Single{
    	private Single(){}
    	private static final Single single = new Single();
    	public static Single getInstance(){
    		return single;
    	}
    }
    

    懒汉式

    方法被调用时才初始化对象,对象的延迟加载

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

    这样的懒汉模式每次调用都会同步,会影响性能,所以又产生了DCL(双重锁模式)

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

    如果不加volatile可能会出现问题,这是由于Jdk5以后支持处理器乱序执行汇编指令,导致指向地址和实例化堆区顺序不同,这时候可能在实例化的过程中其引用已经指向堆内存了,而其地址尚未返回,这时候再做赋值的话,会造成其引用为null的假象

    内部类的单例模式

    其优点在于随用随加载

    public class InnnerClassSingle {
    	private InnnerClassSingle() {	
    	}
    
    	private static class SingleHodler {
    		private static final InnnerClassSingle instance=new InnnerClassSingle();
    	}
    
    	public static InnnerClassSingle getInstance() {
    		return SingleHodler.instance;
    	}
    }
    

    枚举单例模式

    反序列化的时候只会有一个枚举生成
    枚举中的属性必须放在最前面
    枚举中可以和java类一样定义方法
    枚举中的构造方法必须是私有的

    public enum EnumManager {
    	SDCardManager(10) {
    		@Override
    		public EnumManager getSingle() {
    			return SDCardManager;
    		}
    	},
    	HttpManager(1) {
    		@Override
    		public EnumManager getSingle() {
    			return null;
    		}
    	};
    
    	public SdCardImpl getSingleton() {
    		return new SdCardImpl();
    	}
    	
    	public abstract EnumManager getSingle();
    		private EnumManager(int type) {
    	}
    }
    

    使用枚举中的单利

    EnumManager.SDCardManager.getSingleton();
    
  • 相关阅读:
    z-index坑
    一些常用的可以封装好的方法
    echarts线状图
    vue 用js复制内容
    Java并发系列
    ThreadLocal讲解
    TreeMap源码学习
    HashMap源码学习
    Java Socket编程
    socket、tcp、udp、http 的认识及区别
  • 原文地址:https://www.cnblogs.com/cj5785/p/10664626.html
Copyright © 2011-2022 走看看