Holder 方式的单例

x33g5p2x  于2022-04-12 转载在 其他  
字(0.9k)|赞(0)|评价(0)|浏览(219)

一 点睛

Hold 方式的单例完全是借助了类加载的特点。

二 代码

package singleton.singleton3;

// final 不允许继承
public final class Singleton {
    // 实例变量
    private byte[] data = new byte[1024];
    private static Singleton instance = null;

    private Singleton() {
        System.out.println("+++++");
    }

    // 在静态内部类中持有 Singleton 的实例,并且可被直接初始化
    private static class Holder {
        private static Singleton instance = new Singleton();
    }

    // 向 getInstance 方法加入同步控制,每次只能有一个线程能进入
    public static Singleton getInstance() {
        return Holder.instance;
    }

    public static void main(String[] args) {
        System.out.println(Singleton.getInstance());
    }
}

三 测试结果

+++++

singleton.singleton3.Singleton@7a81197d

如果注释掉 System.out.println(Singleton.getInstance()); 则什么都不打印。

四 说明

在 Singleton 类中并没有 instance 的静态成员,而是将其放入到了静态内部类 Holder 中,并不会创建 Singleton 的实例,Holder 类中定义了 Singleton 的静态方法,并且直接进行了实例化,当 Holder 被主动引用的时候则会创建 Singleton 的实例,Singleton 实例的创建过程在 Java 程序编译时期收集到 <clinit>() 方法中,该方法是同步方法,可以保证内存的可见性、JVM 指令的顺序性和原子性、Holder 方式的单例设计是最好的设计之一,也是目前使用比较广的设计之一。

相关文章