研磨设计模式--单例模式-内部类

 * 上面的单例实现存在小小的缺陷,那么 有没有一种方法,既能够实现延迟加载,又能够
 * 实现线程安全呢?
       还真有高人想到这样的解决方案了,这个解决方案被称为Lazy initialization
 * holder class 模式,这个模式综合使用了java的类级内部类和多线程缺省同步锁的知识,
 * 很巧妙的同时实现了延迟加载和线程安全。
 *
 *
 * 1 相应的基础知识
  (1)什么是类级内部类?
   简单点说,类级内部类指的是,有static修饰的成员内部类。如果没有static修饰的成员式内
   部类被称为对象级内部类。
   (2)类级内部类相当于其外部类的static成分,它的对象与外部类对象间不存在依赖关系,因此
   可以直接创建。而对象级内部类的实例,是绑定在外部对象实例中的。
   (3)类级内部类中,可以定义静态的方法。在静态方法中只能引用外部类中的静态成员方法或变量。
   (4)类级内部类相当于其外部类的成员,只有在第一次被使用的时候才会被装载。
  
   多线程缺省同步锁的知识:
   大家都知道,在多线程开发中,为了解决并发问题,主要是通过使用synchronized来加互斥锁进行同步控制,
   但是在某些情况下,JVM已经隐含的为您执行了同步,这些情况下就不用自己再来进行同步控制了。
   这些情况包括:
   (1)由静态初始化器(在静态字段上或static{}块中的初始化器)初始化数据时
   (2)访问final字段时
   (3)在创建线程之前创建对象时
   (4)线程可以看见它将要处理的对象时
  
  
   2 解决方案的思路
        要想很简单的实现线程安全,可以采用静态初始化器的方式,它可以由JVM来保证线程的
   安全性。比如前面的饿汉式实现方式。但是这样一来,不是会浪费一定的空间吗?因为这种
   实现方式,会在类装载的时候就初始化对象,不管你需不需要。
        如果现在有一种方法能够让类装载的时候不去初始化对象,那不就解决问题了?一种可行的
   方式就是采用类级内部类,在这个类级内部类里面去创建对象实例。这样一来,只要不使用到这个类级内部类,

   那就不会创建对象实例,从而同步实现延迟加载和线程安全。


public class Singleton_InnerClass {
        
 private static class SingletonHolder{
  //静态初始化器,由JVM来保证线程安全
  private static Singleton_InnerClass instance=new Singleton_InnerClass();
 }
 
 //私有化构造方法
 private Singleton_InnerClass(){
  
 }
 
 public static Singleton_InnerClass getInstance(){
  return SingletonHolder.instance;
 }
}


阅读更多
个人分类: 设计模式
上一篇spring redis整合
下一篇设计模式之Strategy(策略)
想对作者说点什么? 我来说一句

研磨设计模式单例模式.pdf

2011年11月16日 311KB 下载

研磨单例模式研磨单例模式

2010年12月15日 123KB 下载

研磨设计模式单例模式

2010年09月10日 286KB 下载

研磨设计模式

2018年04月21日 226.56MB 下载

研磨设计模式(完整版pdf)

2011年10月17日 65MB 下载

研磨设计模式全部源代码

2018年01月17日 511KB 下载

研磨设计模式(完整版).PDF

2012年01月06日 41.96MB 下载

研磨设计模式---高清版.pdf

2017年04月10日 316.72MB 下载

没有更多推荐了,返回首页

关闭
关闭