《JAVA与模式》之单例模式

  • 时间:
  • 浏览:0
  • 来源:彩神快三手机版

  你这人实现土土妙招既都要实现应用应用程序安全地创建实例,而又不需要对性能造成太满的影响。它可是我我第一次创建实例的后来 同步,后来 就不都要同步了,从而加快了运行下行速率 。

  都要使用“双重检查加锁”的土土妙招来实现,就都要既实现应用应用程序安全,又都可不后能 使性能不受很大的影响。没人你这人是“双重检查加锁”机制呢?

  3.在创建应用应用程序后来 创建对象时

  4.应用应用程序都要看见它将要正确处理的对象时

  类级内内外部类共要其内外部类的static成分,它的对象与内外部类对象间不地处依赖关系,可是我我可直接创建。而对象级内内外部类的实例,是绑定在内外部对象实例中的。

  后面 的懒汉式单例类实现里对静态工厂土土妙招使用了同步化,以正确处理多应用应用程序环境。

  懒汉式我我确实是并是否比较形象的称谓。既然懒,没人在创建对象实例的后来 就不着急。会老会 等到马上要使用对象实例的后来 才会创建,懒人嘛,老会 推脱不开的后来 才会真正去执行工作,可是我我在装载对象的后来 不创建对象实例。

  饿汉式是典型的空间换时间,当类装载的后来 就会创建类的实例,不管你用不需要,先创建出来,可是我我每次调用的后来 ,就不都要再判断,节省了运行时间。

  “双重检查加锁”机制的实现会使用关键字volatile它的意思是:被volatile修饰的变量的值,将不需要被本地应用应用程序缓存,所有对该变量的读写都不 直接操作共享内存,从而确保多个应用应用程序能正确的正确处理该变量。

  提示:后来 volatile关键字后来 会屏蔽掉虚拟机蕴含些必要的代码优化,太满运行下行速率 并都不 很高。可是我我一般建议,没人不怎么的都要,不须使用。也却搞笑的话,我确实都要使用“双重检查加锁”机制来实现应用应用程序安全的单例,但不须建议几瓶采用,都要根据状态来选泽。

  你这人模式综合使用了Java的类级内内外部类和多应用应用程序缺省同步锁的知识,很巧妙地同时实现了延迟加载和应用应用程序安全。

/**

* 单例都要有本人的操作

*/

public void singletonOperation(){

//功能正确处理

}

}

  作为对象的创建模式,单例模式确保某另4个类必须另4个实例,可是我我自行实例化并向整个系统提供你这人实例。你这人类称为单例类。

  后面 的例子中,在你这人类被加载时,静态变量instance会被初始化,此时类的私有构造子会被调用。这后来 ,单例类的唯一实例就被创建出来了。

  饿汉式我我确实是并是否比较形象的称谓。既然饿,没人在创建对象实例的后来 就比较着急,饿了嘛,于是在装载类的后来 就创建对象实例。

  懒汉式是典型的时间换空间,可是我我每次获取实例都不 进行判断,看是否 都要创建实例,浪费判断的时间。当然,后来 老会 没人人使用搞笑的话,那就不需要创建实例,则节约内存空间

  类级内内外部类共要其内外部类的成员,必须在第一次被使用的后来 才被会装载。

  2.访问final字段时

  使用枚举来实现单实例控制会更加简洁,可是我我无偿地提供了序列化机制,并由JVM从根本上提供保障,绝对正确处理多次实例化,是更简洁、高效、安全的实现单例的土土妙招。

  按照《高效Java 第二版》中的说法:单元素的枚举类型后来 成为实现Singleton的最佳土土妙招。用枚举来实现单例非常简单,只都要编写另4个蕴含单个元素的枚举类型即可。

  朋友都知道,在多应用应用程序开发中,为了正确处理并发问題,主可是我我通过使用synchronized来加互斥锁进行同步控制。可是我我在有些状态中,JVM后来 隐含地为您执行了同步,你这人状态下就不需要本人再来进行同步控制了。你这人状态包括:

  后来 现在并是否土土妙招都可不后能 让类装载的后来 不去初始化对象,那不就正确处理问題了?并是否可行的土土妙招可是我我采用类级内内外部类,在你这人类级内内外部类后面 去创建对象实例。没人 一来,假如不使用到你这人类级内内外部类,那就不需要创建对象实例,从而同时实现延迟加载和应用应用程序安全。

private Singleton(){}

/**

* 类级的内内外部类,也可是我我静态的成员式内内外部类,该内内外部类的实例与内外部类的实例

* 没人绑定关系,可是我我必须被调用到时才会装载,从而实现了延迟加载。

*/

private static class SingletonHolder{

/**

* 静态初始化器,由JVM来保证应用应用程序安全

*/

private static Singleton instance = new Singleton();

}

public static Singleton getInstance(){

return SingletonHolder.instance;

}

}

在阎宏博士的《JAVA与模式》一书中开头是没人 描述单例模式的:

  要想很简单地实现应用应用程序安全,都要采用静态初始化器的土土妙招,它都要由JVM来保证应用应用程序的安全性。比如前面的饿汉式实现土土妙招。可是我我没人 一来,都不 会浪费一定的空间吗?后来 你这人实现土土妙招,会在类装载的后来 就初始化对象,不管你需不都要。

uniqueInstance;

  所谓“双重检查加锁”机制,指的是:并都不 每次进入getInstance土土妙招都都要同步,可是我我先不同步,进入土土妙招后,先检查实例是否 地处,如 果不地处才进行下面的同步块,这是第一重检查,进入同步块后来 ,再次检查实例是否 地处,后来 不地处,就在同步的状态下创建另4个实例,这是第二重检查。没人 一来,就只都要同步一次了,从而减少了多次在同步状态下进行判断所浪费的时间。

  简单点说,类级内内外部类指的是,有static修饰的成员式内内外部类。后来 没人static修饰的成员式内内外部类被称为对象级内内外部类。

  当getInstance土土妙招第一次被调用的后来 ,它第一次读取 SingletonHolder.instance,原困SingletonHolder类得到初始化;而你这人类在装载并被初始化的后来 ,会初始化它的静 态域,从而创建Singleton的实例,后来 是静态的域,可是我我只会在虚拟机装载类的后来 初始化一次,并由虚拟机来保证它的应用应用程序安全性。

  你这人模式的优势在于,getInstance土土妙招并没人被同步,可是我我可是我我执行另4个域的访问,可是我我延迟初始化并没人增加任何访问成本。

  1.由静态初始化器(在静态字段上或static{}块中的初始化器)初始化数据时

  类级内内外部类中,都要定义静态的土土妙招。在静态土土妙招中必须够引用内外部类中的静态成员土土妙招后来 成员变量。

  注意:在java1.4及后来 版本中,太满JVM对于volatile关键字的实现的问題,会原困“双重检查加锁”的失败,可是我我“双重检查加锁”机制只必须用在java5及以上的版本。

  根据后面 的分析,常见的并是否单例实现土土妙招都地处小小的不足英文,没人有没并是否方案,既能实现延迟加载,又能实现应用应用程序安全呢?

  后来 懒汉式的实现是应用应用程序安全的,没人 会降低整个访问的下行速率 ,可是我我每次都不 判断。没人有没人更好的土土妙招实现呢?

  示例代码如下: