美文网首页技术分享
别在说饿汉式单例是项目启动加载了,除非面试官也是菜鸡

别在说饿汉式单例是项目启动加载了,除非面试官也是菜鸡

作者: 小胖学编程 | 来源:发表于2021-06-11 11:44 被阅读0次

常见的说法都是说饿汉式单例模式是项目启动的时候加载,会占用项目资源?但是你有没有认识到,这个说法合理吗?

1.准备知识

1.1 JVM类加载机制

JVM那点事-虚拟机类加载机制

一般场景下,new关键字、调用static常量或者方法、反射均会将类初始化。

image.png

初始化的过程中,完成静态属性、常量属性的赋值。

image.png

1.2 饿汉式单例代码

@Slf4j
public class Singletoneh {
    private final static Singletoneh instance = new Singletoneh();

    private Singletoneh() {
        log.info("==============>我");
    }

    public static Singletoneh getInstance() {
        return instance;
    }



    public void say() {
        System.out.println("【饿汉模式】—实现单例!");
    }

}

2. 饿汉式单例真的是项目启动的时候加载的JVM中吗?

不是!正确的说法:饿汉式单例是在类初始化的时候加载到JVM中。

而类初始化的时机:

  1. new关键字:单例模式构造方法私有化,无法进行调用;
  2. 静态属性/方法:一般是获取单例instance时调用。即:饿汉式单例模式也是在获取单例的时候才会创建单例对象,且放在JVM中。

所以:饿汉式单例模式和懒汉式单例模式初始化时机大部分相同。

但是饿汉式单例本质上是类初始化单例才加载到JVM中,懒汉式单例是真正调用getInstance方法时单例才加载到JVM中。

饿汉式单例可以在如下场景下,不调用getInstance方法,单例对象加载到JVM虚拟机。

  • 饿汉式单例中存在其他静态方法,在调用static getInstance()前调用其他静态方法可以完成单例初始化;
  • 反射调用饿汉式单例的私有构造方法,即可完成初始化;

3. 饿汉式使用final能提前加载吗?

不能!final修饰的常量不会触发类的初始化。

image.png

推荐阅读

关于单例模式饿汉模式的思考

单例模式实现的几种方案

相关文章

  • 别在说饿汉式单例是项目启动加载了,除非面试官也是菜鸡

    常见的说法都是说饿汉式单例模式是项目启动的时候加载,会占用项目资源?但是你有没有认识到,这个说法合理吗? 1.准备...

  • 利用JVM类加载机制实现单例模式

    饿汉式:所谓饿汉式,就是在程序启动或单例模式类被加载的时候,单例模式实例就已经被创建。可能不会使用这个对象,这就造...

  • 单例:更加高效的懒汉式写法

    下面对单例模式的懒汉式与饿汉式进行简单介绍:1、饿汉式:在程序启动或单件模式类被加载的时候,单件模式实例就已经被创...

  • 单例模式

    单例,全局只有一个实例 单例模式可以分为懒汉式和饿汉式: 懒汉式单例模式:在类加载时不初始化。 饿汉式单例模式:在...

  • 单例模式的实现方式

    单例模式的实现 单例模式的实现一般来说有2种方式:懒汉式(延迟加载)、饿汉式(非延迟加载)。 1. 饿汉式(非延迟...

  • 单例模式(懒汉式和饿汉式区别)

    通俗概念 饿汉式饿汉就是类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了。 懒...

  • 设计模式(创建型--单例模式)

    1.饿汉式单例(立即加载方式) 2.懒汉式单例(延迟加载方式) 多线程环境下使用syhchronized 利用双重...

  • Java中单例模式的几种实现

    饿汉式单例 优点是线程安全,缺点时没有办法实现懒加载。 懒汉式+同步方法单例 优点是线程安全,懒加载缺点是效率不高...

  • 单例模式

    单例模式的实现: 单例设计模式分类两种: -饿汉式:类加载就会导致该单实例对象被创建 -懒汉式:类加载不会导致该单...

  • 单例模式

    饿汉式单例 懒汉式单例

网友评论

    本文标题:别在说饿汉式单例是项目启动加载了,除非面试官也是菜鸡

    本文链接:https://www.haomeiwen.com/subject/vsgueltx.html