静态内部类为何能够实现单例?

Posted 小猪快跑22

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态内部类为何能够实现单例?相关的知识,希望对你有一定的参考价值。

public class DeviceHelper 

    private DeviceHelper() 

    

    private static class DeviceHelperHolder 
        /**
         * jvm 虚拟机规定当主动 new 一个对象时会触发类的初始化,初始化阶段也就是执行类构造器 <clinit>()方法的过程;
         * <clinit>() 方法对于类来说不是必须的,如果一个类中既没有静态语句块也没有静态变量赋值动作,
         * 那么编译器都不会为类生成<clinit>()方法。
         *
         * 虚拟机会保证一个类的 <clinit>() 方法在多线程环境中能被正确的枷锁、同步。如果多个线程初始化一个类,
         * 那么只有一个线程会去执行<clinit>()方法,其它线程都需要等待。
         *
         *
         * 下面的 instance 是属于静态变量赋值,那么会执行类构造器 <clinit>() 方法,从而保证线程安全。
         *
         */
        private static DeviceHelper instance = new DeviceHelper();
    

    public static DeviceHelper getInstance() 
        return DeviceHelperHolder.instance;
    

以上是关于静态内部类为何能够实现单例?的主要内容,如果未能解决你的问题,请参考以下文章

Java 设计模式 -- 单例模式的实现(饿汉式枚举饿汉式懒汉式双检锁懒汉式内部类懒汉式)jdk 中用到单例模式的场景DCL实现单例需用volatile 修饰静态变量

Java 设计模式 -- 单例模式的实现(饿汉式枚举饿汉式懒汉式双检锁懒汉式内部类懒汉式)jdk 中用到单例模式的场景DCL实现单例需用volatile 修饰静态变量

静态内部类实现单例模式

使用静态内部类实现单例设计模式

使用静态内部类实现单例设计模式

单例模式 静态库和动态库的区别