单例模式五种实现方式

单例模式是GOF23种设计模式中较为常用的模式之一,它有五种实现方式,个人认为这五种方式没有优劣之分,只是在不同的业务场景下会有不同的表现及特性,这五种实现方式有一个共同的特点就是这五种方式都是线程安全的。

代码及特性

1.饿汉式:单例对象立即加载,没有延时加载机制,效率高

public class Singleton{
	private static Singleton instance = new Singleton();//类加载时立刻加载
	private Singleton(){}  //私有化构造器//方法没有同步,调用效率高
	public static Singleton getInstance(){
		return instance;
	}
}

2.懒汉式:资源利用的效率高了,但是懒加载会导致了调用效率降低。

public class Singleton{
	private static Singleton instance ;
	private Singleton(){}  //私有化构造器
	public static Singleton getInstance(){
		if(instance==null){
			instance=new Singleton();//在用的时候才会实例化单例对象
		}
		return instance;
	}
}

3.双重检测所模式:不常用,因为编译器优化原因和JVM底层内部模型不支持,偶尔会出问题,所以也不建议使用

public class singleton {
	private static volatile singleton instance = null; //volatile实现线程安全
 
  	private singleton() {}//私有化构造方法
  
  	public static singleton getInstance() {
   	       if (instance == null) {
    		    synchronized (singleton.class) {
     			 if (instance == null) {
      			     instance = new singleton();
     			 }
    		     }
   		}
   		return instance;
  	}
 }

4.静态内部类也是一种懒加载模式,兼备并发高效调用和延时加载的优势

public class Singleton{
	private static class SingletonClassInstance{
		private static final Singleton instance = new Singleton();
	}
	private Singleton(){}  //私有化构造器
	public static singleton getInstance(){
		return SingletonClassInstance.instance;
	}
}

5.枚举类实现:唯一的缺点是没有延时加载,可以天然防止反射破解。

public enum Singleton{
	INSTANCE;//定义枚举元素  天然单例  天然防止反射破解
	
	//添加自己需要的操作
	public void singleton(){
		
	}
}

纪念第一次写博客—TIMESTAMP:2019.12.27 15:26:10

发布了15 篇原创文章 · 获赞 2 · 访问量 819

猜你喜欢

转载自blog.csdn.net/oak_javaLearner/article/details/103732443