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();
    	}
    }
    
  • 相关阅读:
    常用Linux命令:ls/cd/pwd/mkdir/rm/mv/cp
    设计模式(5)---代理模式
    设计模式(4)---装饰模式
    设计模式(3)---基本原则
    设计模式(2)---策略模式
    设计模式(1)---简单工厂模式
    linux系统硬件配置查看方法
    boost.asio系列(一)——deadline_timer
    ubuntu 安装JDK
    计算图像数据集的RGB均值
  • 原文地址:https://www.cnblogs.com/lifeone/p/11653140.html
Copyright © 2011-2022 走看看