JavaEE 初阶篇-深入了解单例模式(经典单例模式,饿汉模式、懒汉模式),JavaEE初阶篇,单例模式详解(饿汉模式与懒汉模式),JavaEE初阶篇,单例模式详解(经典、饿汉与懒汉模式)

马肤

温馨提示:这篇文章已超过460天没有更新,请注意相关的内容是否还可用!

摘要:,,本文介绍了JavaEE初阶中的单例模式,包括经典单例模式、饿汉模式和懒汉模式。文章详细解释了单例模式的原理和实现方式,分析了饿汉模式和懒汉模式的特点和适用场景。通过深入了解单例模式,读者可以更好地掌握JavaEE编程中的基础概念,为后续的JavaEE学习打下坚实的基础。

在懒汉式单例模式中,由于实例的创建是在第一次被调用时才进行的,这就涉及到了线程安全问题,在多线程环境下,如果没有适当的同步措施,可能会导致多个实例被创建,从而破坏单例模式的特性。

为了解决懒汉式单例的线程安全问题,一种常见的解决方案是使用synchronized 关键字对getInstance() 方法进行加锁,这样,只有一个线程能够进入这个方法,保证实例只被创建一次,这种方式有一个明显的缺点,那就是每次调用getInstance() 方法时都需要获取锁,会影响性能。

JavaEE 初阶篇-深入了解单例模式(经典单例模式,饿汉模式、懒汉模式),JavaEE初阶篇,单例模式详解(饿汉模式与懒汉模式),JavaEE初阶篇,单例模式详解(经典、饿汉与懒汉模式) 第1张

双重检查锁定机制

为了改善synchronized 关键字带来的性能问题,我们可以使用双重检查锁定机制(Double-Checked Locking),这种机制尽量减少加锁的次数,只在真正需要创建实例的时候才去加锁。

下面是使用双重检查锁定机制的懒汉式单例模式的示例代码:

JavaEE 初阶篇-深入了解单例模式(经典单例模式,饿汉模式、懒汉模式),JavaEE初阶篇,单例模式详解(饿汉模式与懒汉模式),JavaEE初阶篇,单例模式详解(经典、饿汉与懒汉模式) 第2张

public class SingletonLazy {
    private volatile static SingletonLazy instance; // 使用 volatile 关键字保证实例的可见性和禁止指令重排序优化
    
    private SingletonLazy() {}
    
    public static SingletonLazy getInstance() {
        if (instance == null) { // 第一次检查实例是否存在,如果不存在才进入同步块
            synchronized (SingletonLazy.class) { // 同步锁锁定的是类本身,而不是实例对象
                if (instance == null) { // 第二次检查实例是否存在,确保只有一个线程创建实例
                    instance = new SingletonLazy();
                }
            }
        }
        return instance;
    }
    
    // 其他方法...
}

在这个示例中,我们使用了volatile 关键字来保证实例的可见性和禁止指令重排序优化,双重检查锁定机制确保了只有在第一次创建实例时才会进入同步块,从而提高了性能,同步锁锁定的是类本身,确保了线程安全。

通过这种方式,我们既保证了单例模式的实现,又提高了性能效率,在实际开发中,推荐使用这种双重检查锁定机制的懒汉式单例模式来实现单例。

JavaEE 初阶篇-深入了解单例模式(经典单例模式,饿汉模式、懒汉模式),JavaEE初阶篇,单例模式详解(饿汉模式与懒汉模式),JavaEE初阶篇,单例模式详解(经典、饿汉与懒汉模式) 第3张


0
收藏0
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。

相关阅读

  • 【研发日记】Matlab/Simulink自动生成代码(二)——五种选择结构实现方法,Matlab/Simulink自动生成代码的五种选择结构实现方法(二),Matlab/Simulink自动生成代码的五种选择结构实现方法详解(二)
  • 超级好用的C++实用库之跨平台实用方法,跨平台实用方法的C++实用库超好用指南,C++跨平台实用库使用指南,超好用实用方法集合,C++跨平台实用库超好用指南,方法与技巧集合
  • 【动态规划】斐波那契数列模型(C++),斐波那契数列模型(C++实现与动态规划解析),斐波那契数列模型解析与C++实现(动态规划)
  • 【C++】,string类底层的模拟实现,C++中string类的模拟底层实现探究
  • uniapp 小程序实现微信授权登录(前端和后端),Uniapp小程序实现微信授权登录全流程(前端后端全攻略),Uniapp小程序微信授权登录全流程攻略,前端后端全指南
  • Vue脚手架的安装(保姆级教程),Vue脚手架保姆级安装教程,Vue脚手架保姆级安装指南,Vue脚手架保姆级安装指南,从零开始教你如何安装Vue脚手架
  • 如何在树莓派 Raspberry Pi中本地部署一个web站点并实现无公网IP远程访问,树莓派上本地部署Web站点及无公网IP远程访问指南,树莓派部署Web站点及无公网IP远程访问指南,本地部署与远程访问实践,树莓派部署Web站点及无公网IP远程访问实践指南,树莓派部署Web站点及无公网IP远程访问实践指南,本地部署与远程访问详解,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南。
  • vue2技术栈实现AI问答机器人功能(流式与非流式两种接口方法),Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法探究,Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法详解
  • 发表评论

    快捷回复:表情:
    评论列表 (暂无评论,0人围观)

    还没有评论,来说两句吧...

    目录[+]

    取消
    微信二维码
    微信二维码
    支付宝二维码