单例模式

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();
	}
}
posted on 2019-10-11 11:31  YL10000  阅读(119)  评论(0编辑  收藏  举报