Java单例模式的几种常见写法

 更新时间:2022年05月27日 17:20:32   作者:​ Java中文社群   ​  
这篇文章主要介绍了Java单例模式的几种写法,单例模式是面试中的常客了,常见写法有 4 种:饿汉模式、懒汉模式、静态内部类和枚举,接下来我们一起进入文章看看吧

1.饿汉模式

饿汉模式也叫预加载模式,它是在类加载时直接创建并初始化单例对象,所以它并不存在线程安全的问题。它是依靠 ClassLoader 类机制,在程序启动时只加载一次,因此不存在线程安全问题,它的实现代码如下:

public class Singleton {
    // 1.防止外部直接 new 对象破坏单例模式
    private Singleton() {}
    // 2.通过私有变量保存单例对象
    private static Singleton instance = new Singleton();
    // 3.提供公共获取单例对象的方法
    public static Singleton getInstance() {
        return instance;
    }
}

优点:实现简单、不存在线程安全问题。 缺点:类加载时就创建了对象,创建之后如果没被使用,就造成了资源浪费的情况。

2.懒汉模式

懒汉模式和饿汉模式正好是相反的,所谓的懒汉模式也就是懒加载(延迟加载),指的是它只有在第一次被使用时,才会被初始化,

它的实现代码如下:

public class Singleton {
    // 1.防止外部直接 new 对象破坏单例模式
    private Singleton() {}
    // 2.通过私有变量保存单例对象
    private static volatile Singleton instance = null;
    // 3.提供公共获取单例对象的方法
    public static Singleton getInstance() {
        if (instance == null) { // 第一次效验
            synchronized (Singleton.class) {
                if (instance == null) { // 第二次效验
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

懒汉模式使用的是双重效验锁和 volatile 来保证线程安全的,从上述代码可以看出,无论是饿汉模式还是懒汉模式,它们的实现步骤都是一样的:

  • 创建一个私有的构造方法,防止其他调用的地方直接 new 对象,这样创建出来的对象就不是单例对象了。
  • 创建一个私有变量来保存单例对象。
  • 提供一个公共的方法返回单例对象。

懒汉模式相比于饿汉模式来说,不会造成资源的浪费,但写法要复杂一些。

3.静态内部类

静态内部类既能保证线程安全,又能保证懒加载,它只有在被调用时,才会通过 ClassLoader 机制来加载和初始化内部静态类,因此它是线程安全的,此模式的实现代码如下:

public class Singleton {
    // 1.防止外部直接 new 对象破坏单例模式
    private Singleton() {
    }
    // 2.静态内部类
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    // 3.提供公共获取单例对象的方法
    public static final Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

4.枚举

枚举也是在第一次被使用时,才会被 Java 虚拟机加载并初始化,所以它也是线程安全的,且是懒加载的,它的实现代码如下:

public enum  EnumSingleton {
    INSTANCE;
    public EnumSingleton getInstance(){
        return INSTANCE;
    }
}

总结

单例模式适用于经常被访问的对象,或是创建和销毁需要调用大量资源和时间的对象,使用单例模式可以避免频繁创建和销毁对象。单例模式的常用实现方法有 4 种:饿汉模式、懒汉模式、静态内部类和枚举。从写法的简洁性、线程安全性和代码的易懂性等方面综合来看,博主比较推荐使用枚举或懒汉模式来实现单例模式。

到此这篇关于Java单例模式的几种写法的文章就介绍到这了,更多相关Java单例模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java数据库连接池连接Oracle过程详解

    Java数据库连接池连接Oracle过程详解

    这篇文章主要介绍了Java数据库连接池连接Oracle过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Spring IoC学习之ApplicationContext中refresh过程详解

    Spring IoC学习之ApplicationContext中refresh过程详解

    这篇文章主要给大家介绍了关于Spring IoC学习之ApplicationContext中refresh过程的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • SpringBoot使用Logback进行日志记录的代码示例

    SpringBoot使用Logback进行日志记录的代码示例

    在开发Web应用程序时,日志记录是非常重要的一部分,在SpringBoot中,我们可以使用Logback进行日志记录,Logback是一款高性能、灵活的日志框架,它可以满足各种不同的日志需求,在本文中,我们介绍了如何在SpringBoot中使用Logback进行日志记录
    2023-06-06
  • java日常练习题,每天进步一点点(1)

    java日常练习题,每天进步一点点(1)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • Java基础之Math和Random类知识总结

    Java基础之Math和Random类知识总结

    今天带大家来学习java的Math和Random类,文中有非常详细的代码示例及介绍,对正在学习java基础的小伙伴们很有帮助哟,需要的朋友可以参考下
    2021-05-05
  • Spring IOC基于注解启动示例详析

    Spring IOC基于注解启动示例详析

    这篇文章主要给大家介绍了Spring IOC基于注解启动的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • 深入浅析Spring 中的Null-Safety

    深入浅析Spring 中的Null-Safety

    Spring Framework 本身利用了上面这几个注释,但它们也可以运用在任何基于Spring的Java 项目中,以声明空安全api 和 空安全字段。这篇文章主要介绍了Spring 中的Null-Safety相关知识 ,需要的朋友可以参考下
    2019-06-06
  • spring中12种@Transactional的失效场景(小结)

    spring中12种@Transactional的失效场景(小结)

    日常我们进行业务开发时,基本上使用的都是声明式事务,即为使用@Transactional注解的方式,本文主要介绍了spring中12种@Transactional的失效场景,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 学习Java的9张思维导图

    学习Java的9张思维导图

    这篇文章主要为大家详细介绍了学习Java的9张思维导图,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • java实现文件编码转换的方法

    java实现文件编码转换的方法

    这篇文章主要为大家详细介绍了java实现文件编码转换的方法,分享一个文件编码转换的工具类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05

最新评论