单例模式 ( Singleton Pattern )之懒汉与饿汉模式与双检锁/双重校验锁(3)

单例模式 ( Singleton Pattern )

单例模式(Singleton Pattern)提供了一种创建对象的最佳方式

单例模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建,这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象

保证一个类仅有一个实例,并提供一个访问它的全局访问点
优点:

在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例;

避免对资源的多重占用(比如写文件操作);

单例模式的几种实现方式
懒汉式:

需要时候创建实例,线程安全

能够在多线程中很好的工作,但是,效率很低

优点:第一次调用才初始化,避免内存浪费

懒汉式可以避免在不需要实例对象时的资源浪费,只有在需要时才进行创建。这种延迟加载的特性使得它在某些情况下更加高效。

缺点:必须加锁 synchronized 才能保证单例,但加锁会影响效率。getInstance() 的性能对应用程序不是很关键(该方法使用不太多)

为了保证线程安全,在 getInstance() 方法上添加了 synchronized 关键字,使得在多线程环境下只有一个线程能够进入创建实例。保证了多线程情况下只会创建一个实例对象。

java 复制代码
public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
    public static synchronized Singleton getInstance() {  
    if (instance == null) {  
        instance = new Singleton();  
    }  
    return instance;  
    }  
}

实际情况:

java 复制代码
public class FileSingle {
    private static FileSingle instance;
    private File file;

    private FileSingle () {
        // 初始化文件对象
        file = new File("D:\\test.txt");
    }

    public static synchronized FileSingle getInstance() {
        if (instance == null) {
            instance = new FileSingle ();
        }
        return instance;
    }

    public void readFile() {
        // 相应方法...
    }

}
通过 FileSingle .getInstance().readFile() 方法来使用文件管理器

饿汉式

饿汉式是一种在类加载时就创建实例的单例模式。它的特点是无论是否会被使用到,实例对象都在类加载时被创建。

优点:没有加锁,执行效率会提高,线程安全

不会消耗过多的时间或资源。

避免在后续代码中频繁创建和初始化实例。

饿汉式能够保证在任何时候都能获取到实例对象,适用于简单的单例对象的创建和初始化。

java 复制代码
public class Singleton
{  
    private static Singleton instance = new Singleton();  
    private Singleton (){}  
    public static Singleton getInstance() {  
    return instance;  
    }  
}

实际情况:

java 复制代码
public class Logger {
    private static final Logger instance = new Logger();
    
    private Logger() {
        // 初始化日志记录器
    }
    
    public static Logger getInstance() {
        return instance;
    }
    
    public void log(String message) {
        // 记录日志消息
    }
    
    // 其他日志操作方法...
}

通过 Logger.getInstance().log(String message) 方法来使用日志记录器

另外:
双检锁/双重校验锁(DCL,即 double-checked locking)

这种方式采用双锁机制,安全且在多线程情况下能保持高性能getInstance()的性能对应用程序很关键;

一开始就加载实例,线程安全,高性能

java 复制代码
public class Singleton {  
    private volatile static Singleton singleton;  
    private Singleton (){}  
    public static Singleton getSingleton() {  
    if (singleton == null) {  
        synchronized (Singleton.class) {  
        if (singleton == null) {  
            singleton = new Singleton();  
        }  
        }  
    }  
    return singleton;  
    }  
}

这个博客写的不错双检锁/双重校验锁

这个模式在实际开发中日志管理用得多。。。要慢慢在实际代码中去使用一下,不要一直new,虽然new好用哈哈哈,用点设计模式提高点代码观赏性。。。

相关推荐
爱吃甜品的糯米团子1 分钟前
详解 JavaScript 内置对象与包装类型:方法、案例与实战
java·开发语言·javascript
郝学胜-神的一滴23 分钟前
Linux下,获取子进程退出值和异常终止信号
linux·服务器·开发语言·c++·程序人生
程序定小飞36 分钟前
基于springboot的学院班级回忆录的设计与实现
java·vue.js·spring boot·后端·spring
AI科技星37 分钟前
张祥前统一场论动量公式P=m(C-V)误解解答
开发语言·数据结构·人工智能·经验分享·python·线性代数·算法
攀小黑1 小时前
基于若依-内容管理动态修改,通过路由字典配置动态管理
java·vue.js·spring boot·前端框架·ruoyi
CodeByV1 小时前
【C++】继承
开发语言·c++
青云交1 小时前
Java 大视界 -- 基于 Java 的大数据可视化在城市空气质量监测与污染溯源中的应用
java·spark·lstm·可视化·java 大数据·空气质量监测·污染溯源
权泽谦1 小时前
用 Python 做一个天气预报桌面小程序(附源码 + 打包与部署指导)
开发语言·python·小程序
ftpeak2 小时前
《Rust+Slint:跨平台GUI应用》第八章 窗体
开发语言·ui·rust·slint
森语林溪2 小时前
大数据环境搭建从零开始(十七):JDK 17 安装与配置完整指南
java·大数据·开发语言·centos·vmware·软件需求·虚拟机