单例模式之静态内部类

/ **
 *   由静态内部类实现的单例模式
 *由zhaihuilin创建于2018/6/8 16:07。
* /
 public class Thread0 {
      private   Thread0(){}; // 私有的构造方法
 private static class LazyHolder {   // 静态内部类
 private static final   Thread0 instance = new Thread0(); 
             
     }

     public static Thread0 getInstance(){   // 静态的构造方法
 返回 LazyHolder。例如 ;         
     }

  / **
    * 1. 从外部无法访问静态内部类LazyHolder ,只有当调用Singleton.getInstance 方法的时候,才能得到单例对象INSTANCE 2.INSTANCE 对象初始化的时机并不是在单例类的Singleton 被加载的时候,而是在调用getInstance 方法,使得静态内部类LazyHolder 被加载的时候。
        因此这种实现方式是利用classloader 的加载机制来实现懒加载,并保证构造单例的线程安全
      这样的写法虽好但是也存在着单例模式共同的问题:无法防止利用反射来重复构建对象
 * /
     // ?如何利用反射打破单例模式的
约束公共无效   的get()抛出 NoSuchMethodException,IllegalAccessException,的InvocationTargetException,InstantiationException {
          // 1. 获得单例构造器

     
   


             构造函数构造函数= Thread0。class .getDeclaredConstructor();

         // 2. 把构造器设置为可访问
          constructor.setAccessible(true);

         // 3. 使用newInstance()构造两个不同的对象
         Thread0 thread00 =(Thread0)constructor.newInstance();
        Thread0 thread01 =(Thread0)constructor.newInstance();

        // 验证是否是同一个对象
        系统。out .println(thread00.equals(thread01));

}

}

猜你喜欢

转载自blog.csdn.net/zhaihuilin0986/article/details/80625562
今日推荐