zoukankan      html  css  js  c++  java
  • 05 单例模式

    单例模式

    1、饿汉式

    public class HungerySingleton {
    
    	private HungerySingleton() {};
    	
    	private static HungerySingleton instance=new HungerySingleton();
    	
    	public static HungerySingleton getInstance() {
    		return instance;
    	}
    }
    

    在加载的时候已经被实例化,只有一次,线程安全

    但如果一直不使用,占用资源

    2、 懒汉式

    • 2.1 synchronized实现懒汉式

      由于使用了synchronized时代码退化为串行执行
        public class HoonSingleton {
    
    	private HoonSingleton() {};
    	
    	private static HoonSingleton instance;
    	
    	public synchronized static HoonSingleton getInstance() {
    		if (null==instance) {
    			instance=new HoonSingleton();
    		}
    		return instance;
    	}
    }
        
    
    • 2.2 使用DCL(double-checked-locking)实现懒汉式

    在构造方法中进行成员变量赋值时,如果代码进行了重排序,可能导致空指针异常

    public class DCLSingleton {
    
    	private DCLSingleton() {};
    	
    	private volatile static DCLSingleton instance=null;
    	
    	public static DCLSingleton getInstance() {
    		if (null==instance) {
    			synchronized (DCLSingleton.class) {
    				if (null==instance) {
    					instance=new DCLSingleton();
    				}
    			}
    		}
    		return instance;
    	}
    }
    
    • 2.3 使用内部类实现懒汉式

    public class HolderSingleton {
    	
    	private HolderSingleton() {};
    	
    	//原理:内部类在加载的时候不会初始化内部的变量,只有在用到的时候才会进行初始化,而且由jvm保证了线程安全
    	private static class Holder{
    		
    		private static HolderSingleton instance=new HolderSingleton();
    	}
    	
    	public static HolderSingleton getInstance() {
    		return Holder.instance;
    	}
    }
    
    • 2.4 使用枚举实现饿汉式

    public enum EnumSingleton {
    
    	//枚举有类加载后就直接初始化,相对于饿汉式
    	INSTANCE;
    	
    	public static EnumSingleton getInstance() {
    		return INSTANCE;
    	}
    }
    
    • 2.5 使用枚举内部类实现懒汉式

    public class EnumHolderSingleton {
    	
    	private EnumHolderSingleton() {}
    	
    	public static EnumHolderSingleton getInstance() {
    		return EnumHolder.instance;
    	}
    	
    	//依靠内部类延迟加载的功能实现懒汉式单例
    	private enum EnumHolder{
    		INSTANCE;
    		private static EnumHolderSingleton instance=new EnumHolderSingleton();
    	}
    }
    
  • 相关阅读:
    [CF1038F]Wrap Around[AC自动机+dp]
    [LOJ#6198]谢特[后缀数组+trie+并查集]
    [CF986F]Oppa Funcan Style Remastered[exgcd+同余最短路]
    [CF587F]Duff is Mad[AC自动机+根号分治+分块]
    [CF995F]Cowmpany Cowmpensation[树形dp+拉格朗日插值]
    [CF917D]Stranger Trees[矩阵树定理+解线性方程组]
    [CF1007D]Ants[2-SAT+树剖+线段树优化建图]
    [CF1007B]Pave the Parallelepiped[组合计数+状态压缩]
    [CF1010E]Store[kd-tree]
    【JZOJ3598】【CQOI2014】数三角形
  • 原文地址:https://www.cnblogs.com/lifeone/p/11653140.html
Copyright © 2011-2022 走看看