静态内部类为何能够实现单例?
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 修饰静态变量