这是设计模式专栏的第一篇文章,在这个专栏里面会讲到我们在开发中经常使用的设计模式,我会用心将它们解析,然后讲给你们听,如果感兴趣可以持续关注这个专栏❤️
这次我们要讲的是单例模式,这个在大厂面试中十分常见,有的面试官会让你手撕一个单例模式。抛去面试不谈,单例模式也是我们开发中常用的软件设计思想,许多框架的底层设计都是运用到这个设计思路,所以掌握好单例模式十分有必要
单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。
使用单例模式的场景有哪些呢?
这些对象只需要一个实例,避免重复创建造成资源浪费或状态不一致。
new
创建实例。单例模式创建分为饿汉式和懒汉式,接下来让我们一一解析
为什么叫饿汉式呢?因为类加载就会导致该单实例对象被创建。
那类加载又是什么呢?
在 Java 中,类加载 是指将 .class
文件(字节码文件)加载到 JVM(Java 虚拟机)中,并为其创建一个 java.lang.Class
对象的过程。这个过程是由 类加载器(ClassLoader) 完成的。
但是JVM不会在一开始就加载所有的类,而是在运行时按需加载,也就是说当某个类第一次被主动使用时才会触发类加载。例如:
new
)还有一些被动引用的情况不会触发类加载,比如访问静态常量(编译期确定的 final static 常量),就不会触发类初始化。
下面讲讲饿汉式怎么创建单例:
public class Singleton{
//1. 私有无参构造方法
private Singleton(){}
//2. 创建对象
private static Singleton instance = new Singleton();
//3. 向外提供公共方法,可以获取单例对象
public static Singleton getInstance(){
return instance;
}
}
public class Singleton{
//1. 私有无参构造方法
private Singleton(){}
//2. 创建对象
private static Singleton instance;
//3. 静态代码块进行赋值
static{
instance = new Singleton();
}
//4. 向外提供公共方法,可以获取单例对象
public static Singleton getInstance(){
return instance;
}
}
枚举类型是线程安全的,并且只会装载一次。枚举是单例实现中唯一一种不会被破坏的单例实现模式
public enum Singleton{
INSTANCE;
}
懒汉式,顾名思义就是,意思就是需要创建的时候再创建。类加载并不会导致该单实例对象创建,而是首次使用该对象时才会创建。
public class Singleton{
//1. 私有无参构造方法
private Singleton(){}
//2. 创建对象,使用volatile关键字防止指令重排序与保证变量可见性
private static volatile Singleton instance;
//3. 向外提供公共方法,可以获取单例对象
public static Singleton getInstance() {
if (instance == null) {
//synchronized关键字修饰代码块保证只有一个线程可以创建单例对象
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
这就是单例模式的解析,我们下次再见。
如果你看了这篇文章有收获可以点赞+关注+收藏,这是对笔者更新的最大鼓励!如果你有更多方案或者文章中有错漏之处,请在评论区提出帮助笔者勘误,祝你拿到更好的offer!