设计模式之单例模式

单例模式

简单来说,就是一个类只能有一个实例,并且在项目中都能访问这个实例。

单例模式分为两大类

  • 懒汉模式:实例在第一次使用时就创建
  • 饿汉模式:实例在类装载时才被创建

1. 饿汉模式

  • ‘ 饿汉模式 ’ 的代码如下
class Singleton {
	private static Singleton instance = new Singleton();
	private Singleton(){}
	public static Singleton getInstance() {
		return instance;
	}
}
1.2 由于instance的初始化是在类加载时进行的,类加载是由classloader实现的,如果初始化太早,容易造成资源浪费。

2. 懒汉模式

  • ‘ 懒汉模式 ’ 的代码如下
class Singleton {
	private static volatile Singleton instance = null;
	private Singleton(){}

	public static Singleton getInstance() {
		if(instance == null){
			synchronized (Singleton.class) {
				if(instance == null)
				instance = new Singleton();
			}
		}
		return instance;
	}
}
  • 这种方法每次在获取instance之前先进行判断,如果instance为空的话,就new一个出来,否则就返回之前已存在的instance。

  • 该方法虽然有些复杂,其中有两次的 if(instance == null) 判断,第一个解决了多线程时等待的效率问题,第二个则防止可能出现多个实例的情况,而volatile关键字起的作用则是禁止指令重排,这样对它的写操作就会有一个内存屏障,这样,在他的赋值完成之前,不会调用读操作。

原文地址:https://www.cnblogs.com/mengzhao/p/10007992.html