单例模式的 8 种写法,整理非常全!

简介: 单例模式即一个 JVM 内存中只存在一个类的对象实例。

概念

单例模式即一个 JVM 内存中只存在一个类的对象实例。

image.png

分类

1、懒汉式

使用的时候才创建实例

2、饿汉式

类加载的时候就创建实例

当然还有其他的生成单例的方式,双重校验锁,枚举和静态内部类,文中会有介绍。

懒汉式

1) 示例1

public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
    public static Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
    }  
}

线程不安全,不可用。

2) 示例2

public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
    public static synchronized Singleton getInstance() { 
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
    }  
}

同步方法,线程安全,效率低,不推荐。

3) 示例3

public class Singleton {
    private static Singleton singleton;
  private Singleton() {}
    public static Singleton getInstance() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                singleton = new Singleton();
            }
        }
        return singleton;
    }
}

线程不安全,会产生多个实例,不可用。

饿汉式

无线程安全问题,不能延迟加载,影响系统性能。

4) 示例1

public class Singleton {  
    private static Singleton instance = new Singleton();  
    private Singleton (){}  
    public static Singleton getInstance() {  
    return instance;  
    }  
}

5) 示例2

public class Singleton {  
    private static Singleton instance = null;  
    static {  
    instance = new Singleton();  
    }  
    private Singleton (){}  
    public static Singleton getInstance() {  
    return instance;  
    }  
}

6) 双重校验锁

public class Singleton {
    private static volatile Singleton singleton;
    private Singleton() {}
    public static Singleton getInstance() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

双重校验锁,线程安全,推荐使用。

7) 静态内部类

public class Singleton {  
    private static class SingletonHolder {  
    private static final Singleton INSTANCE = new Singleton();  
    }  
    private Singleton (){}  
    public static final Singleton getInstance() {  
    return SingletonHolder.INSTANCE;  
    }  
}

静态内部类,线程安全,主动调用时才实例化,延迟加载效率高,推荐使用。

8) 枚举

public enum Singleton {  
    INSTANCE;  
    public void whateverMethod() {  
    }  
}

枚举类型,无线程安全问题,避免反序列华创建新的实例,很少使用。

注意事项

1、考虑多线程问题

2、单例类构造方法要设置为private类型禁止外界new创建

private Singleton() {}

3、如果类可序列化,考虑反序列化生成多个实例问题,解决方案如下

private Object readResolve() throws ObjectStreamException {
  // instead of the object we're on, return the class variable INSTANCE  
  return INSTANCE;  
}

使用场景

1、工具类对象


2、系统中只能存在一个实例的类


3、创建频繁或又耗时耗资源且又经常用到的对象


下面是单例模式在JDK的应用

image.png




另外,Spring 容器中的实例默认是单例饿汉式类型的,即容器启动时就实例化 bean 到容器中,当然也可以设置懒汉式 defalut-lazy-init="true" 为延迟实例化,用到时再实例化。



image.png

相关文章
|
7月前
|
存储 网络协议 数据安全/隐私保护
SMTP/POP3/IMAP(电子邮件协议)
本文介绍了电子邮件系统中常用的三种协议:SMTP、POP3 和 IMAP。SMTP(简单邮件传输协议)用于发送邮件,设计简单且广泛支持;POP3(邮局协议版本3)用于接收邮件,适合离线使用但不支持文件夹管理;IMAP(互联网消息访问协议)允许用户在服务器上管理邮件,支持多设备同步和部分下载。文章还对比了这三种协议的功能、端口及特点,并分析了它们在实际场景中的应用,帮助用户根据需求选择合适的协议。
3038 24
|
11月前
|
机器学习/深度学习 编解码 人工智能
STAR:南京大学联合字节开源视频超分辨率增强生成框架,视频清晰度一键提升,支持从低分辨率视频生成高分辨率视频
STAR 是由南京大学、字节跳动和西南大学联合推出的视频超分辨率框架,能够将低分辨率视频提升为高分辨率,同时保持细节清晰度和时间一致性。
2238 13
STAR:南京大学联合字节开源视频超分辨率增强生成框架,视频清晰度一键提升,支持从低分辨率视频生成高分辨率视频
|
12月前
|
API 索引
鸿蒙开发:实现一个超简单的网格拖拽
实现拖拽,最重要的三个方法就是,打开编辑状态editMode,实现onItemDragStart和onItemDrop,设置拖拽移动动画和交换数据,如果想到开启补位动画,还需要实现supportAnimation方法。
325 13
鸿蒙开发:实现一个超简单的网格拖拽
|
缓存 NoSQL Java
如何在Java中实现分布式缓存?
如何在Java中实现分布式缓存?
阿里云web应用
设备端将图片编码为base64发送至物联网平台,在web界面配置图片选择物联网平台配置的数据(base64),实现设备向云平台的图片的上传,以及在web界面上显示图片。
|
存储 Linux API
Livepatch 系统状态变更【ChatGPT】
Livepatch 系统状态变更【ChatGPT】
|
存储 编译器 Go
Go 语言变量
Go 语言变量
113 0
|
人工智能 测试技术
软件测试/人工智能|测试数据很头疼,ChatGPT帮你造
软件测试/人工智能|测试数据很头疼,ChatGPT帮你造
|
索引 Python
python复习第一章(二)
python复习第一章(二)
148 0
|
人工智能 自然语言处理 算法
《阿里云智能客服知识运营白皮书》电子版
白皮书以阿里云智能客服系统为应用标的,面向智能客服中的知识定义、知识应用、知识梳理方法三大环节进行描述和说明,希望为智能客服领域的知识应用提供具备指导性意义的方法论。
360 0
《阿里云智能客服知识运营白皮书》电子版