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 方式的单例设计是最好的设计之一,也是目前使用比较广的设计之一。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/chengqiuming/article/details/124107769
内容来源于网络,如有侵权,请联系作者删除!