java设计模式--单例模式推理过程

java 设计模式–单例模式推理过程

设计模式(全名:软件设计模式),是一套反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码可靠性,程序的重用性。

1. 单例模式

1.1单例模式的特点
  1. 单例类只能有一个实例。
  2. 单例类必须自己创建自己唯一的实例。
  3. 单例类必须给所有其他对象提供这个实例。
1.2 实现过程【懒汉】
  1. 第一次
/*
* 1. 私有的构造方法
* 	共有的话别人一调用就会有新的单例对象,没法保证单一的实例
*  2. 公有静态的方法 ---- 用来调用私有的构造方法
* 	由于构造方法是私有的,我们要想调用的话,必须在类内有一个方法,这个方法能够调用这个构造方法,而且在类外也可以使用。
*/
public class SingleTon {
	private SingleTon() {}

	public static SingleTon getInstance() {
		return new SingleTon();
	}
}

但是以上代码有问题:
a . 每次调用 getInstance() 方法返回的是不同的对象(new)。
b. 我们希望其只有一个实例

  1. 第二次改进

public class SingleTon {
	private SingleDog() {}
	
	//使用static是为了数据的持久性
	private static SingleTon instance = null; 
	
	public static SingleTon getInstance() { 
		if (null == instance) {
			instance = new SingleTon();
		}
		return instance; 
	}
 }

这样调用能基本实现我们的需求,但是仍然存在一个问题,如果在多线程的情况下,有两个线程同时调用getInstance()方法且满足if条件(有这个可能偶),这个时候得到的对象不是同一个对象。

  1. 第三次改进
    针对于这个问题,我们直接加synchronized锁来实现就可以了
public class SingleTon {
	private SingleTon() {}
	
	private static SingleTon instance = null; 
	
	//只要创建对象就必须进入同步代码块
	public static synchronized SingleTon getInstance() { 
		if (null == instance) {
			instance = new SingleTon();
		}
		return instance; 
	}
}
// 我们为了进一步优化,可以这样写
public class SingleTon {
	private SingleTon() {}
	private static SingleTon instance = null; 

	public static SingleTon getInstance() { 
	
		// 判定是否为空,只有是空的时候才去进入同步代码部分
  		if (null == instance) {
  			synchronized (SingleTon .class) {
  				//再次检查,以防有多个都在准备进入同步代码块
  				if (null == instance) {
					instance = new SingleTon();
				}
  			}
  		}
  		return instance; 
	 	}
	}
}

第三次改进的代码又称为懒汉单例模式(自己懒得new对象,通过方法new),接下来介绍饿汉单例模式。

1.3 饿汉单例模式
public class SingleTon {
	private static SingleTon instance = new SingleTon();
	private SingleTon() {}
	
	public static SingleTon instance() {
 		return instance; 
	}
}

这个不存在懒汉的多线程安全问题,这个在调用方法的时候就已经存在了唯一的单例类对象,方法只是将这个类对象的地址进行返回。

你可能感兴趣的:(java设计模式--单例模式推理过程)