
本期讲解单例模式的饿汉模式与懒汉模式,以及如何解决懒汉模式造成线程的不安全问题。
目录
什么是单例模式?
首先,单例模式是一种设计模式。何为设计模式,设计模式类似于固定的套路。例如考驾照的科目二项目,教练会总结出一些点位,因此我们按照这些点位去练习然后考试就能很顺畅的通过。在 Java 中也是如此,常见的就是开发中前辈设计好的一些案例,我们直接拿来用即可。
单例模式是在进程中有且仅有一份实例的模式,所以我们称之为单例。此外单例模式分为饿汉模式与懒汉模式。

通过上图,我们可以看到。thread1 - thread3 都共用 Singleton 这个实例,这样的一个模式就是单例模式。
1. 饿汉模式
看到饿汉二字,我们就会想到这是一种饥渴的状态,有一种一看到饭就冲上去吃的感觉。因此,饿汉模式它是一种类加载时就创建对象的一种模式,如下代码:
//自定义类singleton
class Singleton {
//创建一个对象
private static Singleton instance = new Singleton();
//提供一个获取instance的方法
private static Singleton getInstance(){
return instance;
}
}
当以上代码中的自定义类 singleton 被加载后,就会创建一个 instance的对象。这时候我们就可以通过一个获取 instance 对象的方法 getInstance 来使用这个实例。由于 singleton 类中的所有成员变量与成员方法都是被 private 修饰,因此达到了封装效果也体现出了单例模式的唯一性。
饿汉模式强调一个饥渴,类一被加载就创建了一个对象。它不存在线程安全问题,当多个线程调用这个饿汉模式时得到的都是同一个实例,并不重新创建实例。
以上的饿汉模式,设计得还是有问题的。如果我们新建了一个实例,这样就不能保证饿汉模式是一个单例模式,如以下代码:
public static void main(String[] args) {
//s1和s2都是同一个实例
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
//s3新建了一个实例
Singleton s3 = new Singleton();
}
因此,我们必须保证在 Singleton 类不能被实例化,这时我们可以在 Singleton类 中提供一个被 private 修饰的构造方法,这样无论如何 Singleton 类都不能被 new 了。如下行
本文详细介绍了Java中的单例模式,包括饿汉模式和懒汉模式。饿汉模式在类加载时即创建实例,无线程安全问题,而懒汉模式在多线程环境下可能导致实例创建多次。为解决懒汉模式的线程安全问题,文章提出了通过同步锁(synchronized)和双重检查锁定(DCL,double-checkedlocking)配合volatile关键字来确保实例的唯一性。
最低0.47元/天 解锁文章
430

被折叠的 条评论
为什么被折叠?



