单例模式之静态内部类

/ **
 *   由静态内部类实现的单例模式
 *由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));

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值