Java设计模式(一)

  • 时间:
  • 浏览:3

一、特点:

1、单例类不可可不都能能 能有那我实例。

2、单例类须要本人创建本人的唯一实例。

3、单例类须要给所有或多或少对象提供或多或少实例。

单例模式确保某个类不可可不都能能 能那我实例,而且自行实例化并向整个系统提供或多或少实例。

3、那此是守护守护进程安全?

可能性你的代码所在的守护守护进程中有 多个守护守护进程在一起运行,而那此守护守护进程可能性会一起运行这段代码。可能性每次运行结果和单守护守护进程运行的结果是一样的,而且或多或少的变量的值也和预期的是一样的,也不我我守护守护进程安全的。

可能性说:那我类可能性守护守护进程所提供的接口对于守护守护进程来说是原子操作,可能性多个守护守护进程之间的切换太多原因分析分析着该接口的执行结果居于二义性,也也不我我说我们我们太多考虑同步的大间题,那也不我我守护守护进程安全的。

(五)、单例和枚举

用枚举来实现单例非常简单,只须要编写那我中有 单个元素的枚举类型即可。

使用枚举来实现单实例控制会更加简洁,而且无偿地提供了序列化机制,并由JVM从根本上提供保障,绝对补救多次实例化,是更简洁、高效、安全的实现单例的土土办法 。

或多或少实现土土办法 既须要实现守护守护进程安全地创建实例,而又太多对性能造成太多的影响。它也不我我第一次创建实例的事先 同步,事先 就不须要同步了,从而加快了运行速率。

(摘自网络)提示:可能性volatile关键字可能性会屏蔽掉虚拟机中或多或少必要的代码优化,太多太多太多太多有运行速率并都在很高。而且一般建议,这么有点痛 的须要,之太多太多太多太多有使用。也也不我我说,人太好须要使用“双重检查加锁”机制来实现守护守护进程安全的单例,但之太多太多太多太多有建议血块采用,须要根据情况汇报来选则。

Singleton通过将构造土土办法 限定为private补救了类在内部人员被实例化,在同那我虚拟机范围内,Singleton的唯一实例不可可不都能能 能通过getInstance()土土办法 访问。

(事实上,通过Java反射机制是可不都能能 实例化构造土土办法 为private的类的,那基本上会使所有的Java单例实现失效。此大间题在此处不做讨论,姑且掩耳盗铃地认为反射机制不居于。)

但 是以上懒汉式单例的实现这么考虑守护守护进程安全大间题,它是守护守护进程不安全的,并发环境下很可能性出显多个Singleton实例,要实现守护守护进程安全,有以下本身土土办法 ,都 是对getInstance或多或少土土办法 改造,保证了懒汉式单例的守护守护进程安全,可能性你第一次接触单例模式,对守护守护进程安太多太多太多太多有在很了解,须要先跳过下面这三小条,去看 饿汉式单例,等都都看 面再回头考虑守护守护进程安全的大间题:

结果:

tanggao

tanggao

zsy

zsy1

3346521 3346521

true

(三)、静态(类级)内部人员类

以上内容来自平时所看书籍和网络资源整理测试所得,如有不完善之处,欢迎指正!

饿汉式在类创建的一起就可能性创建好那我静态的对象供系统使用,事先 不再改变,太多太多太多太多有天生是守护守护进程安全的。

二.分类

(一)、懒汉式单例

三、饿汉式和懒汉式区别

从名字上来说,饿汉和懒汉,

饿汉也不我我类一旦加载,就把单例初始化完成,保证getInstance的事先 ,单例是可能性居于的了,

而懒汉比较懒,不可可不都能能 能当调用getInstance的事先 ,才回去初始化或多或少单例。

另外从以下两点再区分以下这本身土土办法 :

或多或少比里面1、2都好或多或少,既实现了守护守护进程安全,又补救了同步带来的性能影响。 当getInstance土土办法 第一次被调用的事先 ,它第一次读取 SingletonHolder.instance,原因分析分析着SingletonHolder类得到初始化;而或多或少类在装载并被初始化的事先 ,会初始化它的静 态域,从而创建Singleton的实例,可能性是静态的域,而且只会在虚拟机装载类的事先 初始化一次,并由虚拟机来保证它的守护守护进程安全性。

或多或少模式的优势在于,getInstance土土办法 并这么被同步,而且也不我我执行那我域的访问,而且延迟初始化并这么增加任何访问成本。

1、在getInstance土土办法 加带同步

(二)、双重检查锁定

须要使用“双重检查加锁”的土土办法 来实现,就须要既实现守护守护进程安全,又可不都能能 使性能不受很大的影响。这么那此是“双重检查加锁”机制呢?

所谓“双重检查加锁”机制,指的是:并都在每次进入getInstance土土办法 都须要同步,也不我我先不同步,进入土土办法 后,先检查实例否是居于,如 果不居于才进行下面的同步块,这是第一重检查,进入同步块事先 ,再次检查实例否是居于,可能性不居于,就在同步的情况汇报下创建那我实例,这是第二重检查。那我 一来,就只须要同步一次了,从而减少了多次在同步情况汇报下进行判断所浪费的时间。

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

注意:在java1.4及事先 版本中,太多太多太多太多有JVM对于volatile关键字的实现的大间题,会原因分析分析着“双重检查加锁”的失败,而且“双重检查加锁”机制只不可可不都能能 能用在java5及以上的版本。

单例模式

一、特点:

二.分类

(一)、懒汉式单例

(二)、双重检查锁定

(三)、静态(类级)内部人员类

(四)、饿汉式单例

(五)、单例和枚举

三、饿汉式和懒汉式区别

2、资源加载和性能:

饿汉式在类创建的一起就实例化那我静态对象出来,不管事先 会太多使用或多或少单例,回会居于一定的内存,而且相应的,在第一次调用时速率也会减慢,可能性其资源可能性初始化完成,

而懒汉式顾名思义,会延迟加载,在第一次使用该单例的事先 才会实例化对象出来,第一次调用须要做初始化,可能性要做的工作比较多,性能上会或多或少延迟,事先 就和饿汉式一样了。

至于1、2、3这本身实现又或多或少区别,

第1种,在土土办法 调用加带了同步,人太好守护守护进程安全了,而且每次都在同步,会影响性能,毕竟99%的情况汇报下是不须要同步的,

第2种,在getInstance中做了两次null检查,确保了不可可不都能能 能第一次调用单例的事先 才会做同步,那我也是守护守护进程安全的,一起补救了每次都同步的性能损耗

第3种,保证初始化instance时不可可不都能能 能那我守护守护进程,太多太多太多太多有也是守护守护进程安全的,一起这么性能损耗,一般倾向于使用或多或少种。

(四)、饿汉式单例

1、守护守护进程安全:

饿汉式天生也不我我守护守护进程安全的,须要直接用于多守护守护进程而太多出显大间题,

懒汉式本身是非守护守护进程安全的,为了实现守护守护进程安全有几种写法,分别是里面的1、2、3,这本身实现在资源加载和性能方面或多或少区别。

 相关测试代码: