1.定义
单例模式是一种创建型设计模式,它通过使用私有构造函数和静态方法来确保一个类只有一个实例,并且提供全局访问点来获取该实例。
通过使用单例模式,我们可以方便地管理全局唯一的对象实例,并且避免了多次创建相同类型的对象所带来的资源浪费问题
2.业务场景
单例模式适用于需要在整个系统中共享同一个对象实例的情况。
例如,在多线程环境下需要共享同一个资源池或者配置信息等
3.经典写法
单例模式有多种经典写法,其中最常见的是饿汉式和懒汉式两种。
饿汉式:
在类加载时就创建了对象实例,并且通过静态方法返回该实例。这种方式比较简单,但是会导致程序启动变慢,因为需要提前创建对象实例。例如:
public class Singleton {
// 定义一个私有静态常量 instance,并且在类加载时就创建了对象实例
private static final Singleton instance = new Singleton();
// 定义一个私有构造函数,用于限制外部实例化该类
private Singleton() {}
// 定义一个公共静态方法 getInstance,用于返回单例对象实例
public static Singleton getInstance() {
return instance;
}
}
通过定义一个私有静态常量 instance 来确保只有一个对象实例,并且在类加载时就创建了该对象实例。同时还定义了一个私有构造函数 Singleton() 来限制外部实例化该类。最后通过公共静态方法 getInstance() 来返回单例对象实例。
这种方式比较简单和直接,但是会导致程序启动变慢,因为需要提前创建对象实例。同时也不能够支持延迟加载和线程安全性等需求
懒汉式:
在第一次调用时才创建对象实例,并且通过双重检查锁定来确保线程安全性。这种方式比较复杂,但是可以避免不必要的资源浪费。例如:
public class Singleton {
// 定义一个私有静态变量 instance,并且使用 volatile 关键字来确保线程安全性
private static volatile Singleton instance;
// 定义一个私有构造函数,用于限制外部实例化该类
private Singleton() {}
// 定义一个公共静态方法 getInstance,用于返回单例对象实例
public static Singleton getInstance() {
if (instance == null) { // 第一次检查对象是否已经创建
synchronized (Singleton.class) { // 加锁操作,确保只有一个线程能够进入下面的代码块
if (instance == null) { // 第二次检查对象是否已经创建(双重检查锁定)
instance = new Singleton(); // 创建对象实例并赋值给 instance 变量
}
}
}
return instance; // 返回单例对象实例
}
}
通过定义一个私有静态变量 instance 来确保只有一个对象实例,并且使用 volatile 关键字来确保线程安全性。同时还定义了一个私有构造函数 Singleton() 来限制外部实例化该类。最后通过公共静态方法 getInstance() 来返回单例对象实例。
在 getInstance() 方法中,首先会进行第一次检查来判断对象是否已经被创建;如果没有,则会加锁并进入同步代码块中进行第二次检查和创建操作(双重检查锁定);最后再返回单例对象实例。这种方式可以避免不必要的资源浪费,并且支持延迟加载和线程安全性等需求。文章来源:https://www.toymoban.com/news/detail-529640.html
需要注意的是,在 JDK5.0 之前版本中,由于 Java 内存模型的问题可能导致双重检查锁定失效。因此,在 JDK5.0 及以上版本中推荐使用该方式来实现懒汉式单例模式。文章来源地址https://www.toymoban.com/news/detail-529640.html
到了这里,关于实际开发中常用的设计模式--------单例模式(知识跟业务场景结合)-----小白也能看懂(通俗易懂版本)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!