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

Aine ·
更新时间:2024-09-21
· 830 次阅读

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

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

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

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

第二次改进 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条件(有这个可能偶),这个时候得到的对象不是同一个对象。

第三次改进
针对于这个问题,我们直接加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; } }

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


作者:0菜鸡小白0



java设计模式 推理 JAVA 单例模式

需要 登录 后方可回复, 如果你还没有账号请 注册新账号