Java设计模式(一)

  • 时间:
  • 浏览:2

(五)、单例和枚举

用枚举来实现单例非常简单,只还都后会 编写另有1个含晒 单个元素的枚举类型即可。

二.分类

(一)、懒汉式单例

(二)、双重检查锁定

能只能使用“双重检查加锁”的措施来实现,就能只能既实现守护进程安全,又都都后会 使性能不受很大的影响。这么哪几个是“双重检查加锁”机制呢?

所谓“双重检查加锁”机制,指的是:并都不 每次进入getInstance措施都还都后会 同步,已经 先不同步,进入措施后,先检查实例是是否是地处,如 果不地处才进行下面的同步块,这是第一重检查,进入同步块完后 ,再次检查实例是是否是地处,愿因 分析不地处,就在同步的情况表下创建另有1个实例,这是第二重检查。另有1个 一来,就只还都后会 同步一次了,从而减少了多次在同步情况表下进行判断所浪费的时间。

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

注意:在java1.4及完后 版本中,已经 JVM对于volatile关键字的实现的现象,会愿因 “双重检查加锁”的失败,怎么让“双重检查加锁”机制只只能用在java5及以上的版本。

你你這個实现措施既能只能实现守护进程安全地创建实例,而又不不对性能造成太少的影响。它已经 第一次创建实例的完后 同步,完后 就只能同步了,从而加快了运行传输速率。

(摘自网络)提示:愿因 分析volatile关键字愿因 分析会屏蔽掉虚拟机中许多必要的代码优化,已经 运行传输速率并都不 很高。怎么让一般建议,这么特别的还都后会 ,不须使用。也已经 说,觉得 能只能使用“双重检查加锁”机制来实现守护进程安全的单例,但不须建议几瓶采用,能只能根据情况表来选者。

Singleton通过将构造措施限定为private外理了类在内控 被实例化,在同另有1个虚拟机范围内,Singleton的唯一实例只能通过getInstance()措施访问。

(事实上,通过Java反射机制是都都后会 实例化构造措施为private的类的,那基本上会使所有的Java单例实现失效。此现象在此处不做讨论,姑且掩耳盗铃地认为反射机制不地处。)

但 是以上懒汉式单例的实现这么考虑守护进程安全现象,它是守护进程不安全的,并发环境下很愿因 分析出显多个Singleton实例,要实现守护进程安全,有以下你這個措施,都 是对getInstance你你這個措施改造,保证了懒汉式单例的守护进程安全,愿因 分析你第一次接触单例模式,对守护进程安已经 不 很了解,能只能先跳过下面这三小条,去看 饿汉式单例,等看完后 面再回头考虑守护进程安全的现象:

(四)、饿汉式单例

1、守护进程安全:

饿汉式天生已经 守护进程安全的,能只能直接用于多守护进程而不什么都这么显现象,

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

3、哪几个是守护进程安全?

愿因 分析你的代码所在的守护进程含晒 多个守护进程在一并运行,而哪几个守护进程愿因 分析会一并运行这段代码。愿因 分析每次运行结果和单守护进程运行的结果是一样的,怎么让许多的变量的值也和预期的是一样的,已经 守护进程安全的。

愿因 分析说:另有1个类愿因 分析守护进程所提供的接口对于守护进程来说是原子操作,愿因 分析多个守护进程之间的切换不不愿因 该接口的执行结果地处二义性,也已经 说亲戚亲戚朋友不不考虑同步的现象,那已经 守护进程安全的。

单例模式

一、特点:

二.分类

(一)、懒汉式单例

(二)、双重检查锁定

(三)、静态(类级)内控 类

(四)、饿汉式单例

(五)、单例和枚举

三、饿汉式和懒汉式区别

你你這個比上面1、2都好许多,既实现了守护进程安全,又外理了同步带来的性能影响。 当getInstance措施第一次被调用的完后 ,它第一次读取 SingletonHolder.instance,愿因 SingletonHolder类得到初始化;而你你這個类在装载并被初始化的完后 ,会初始化它的静 态域,从而创建Singleton的实例,愿因 分析是静态的域,怎么让只会在虚拟机装载类的完后 初始化一次,并由虚拟机来保证它的守护进程安全性。

你你這個模式的优势在于,getInstance措施并这么被同步,怎么让已经 执行另有1个域的访问,怎么让延迟初始化并这么增加任何访问成本。

 相关测试代码:

一、特点:

1、单例类只能有另有1个实例。

2、单例类还都后会 买车人创建买车人的唯一实例。

3、单例类还都后会 给所有许多对象提供你你這個实例。

单例模式确保某个类只能另有1个实例,怎么让自行实例化并向整个系统提供你你這個实例。

使用枚举来实现单实例控制会更加简洁,怎么让无偿地提供了序列化机制,并由JVM从根本上提供保障,绝对外理多次实例化,是更简洁、高效、安全的实现单例的措施。

(三)、静态(类级)内控 类

三、饿汉式和懒汉式区别

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

饿汉已经 类一旦加载,就把单例初始化完成,保证getInstance的完后 ,单例是愿因 分析地处的了,

而懒汉比较懒,只能当调用getInstance的完后 ,才回去初始化你你這個单例。

另外从以下两点再区分以下这你這個措施:

饿汉式在类创建的一并就愿因 分析创建好另有1个静态的对象供系统使用,完后 不再改变,已经 天生是守护进程安全的。

1、在getInstance措施加带同步

2、资源加载和性能:

饿汉式在类创建的一并就实例化另有1个静态对象出来,不管之都不 不不使用你你這個单例,都不 地处一定的内存,怎么让相应的,在第一次调用时传输速率也会更快,愿因 分析其资源愿因 分析初始化完成,

而懒汉式顾名思义,会延迟加载,在第一次使用该单例的完后 才会实例化对象出来,第一次调用还都后会 做初始化,愿因 分析要做的工作比较多,性能上会许多延迟,完后 就和饿汉式一样了。

至于1、2、3这你這個实现又许多区别,

第1种,在措施调用加带了同步,觉得 守护进程安全了,怎么让每次都不 同步,会影响性能,毕竟99%的情况表下是只能同步的,

第2种,在getInstance中做了两次null检查,确保了只能第一次调用单例的完后 才会做同步,另有1个也是守护进程安全的,一并外理了每次都同步的性能损耗

第3种,保证初始化instance时只能另有1个守护进程,已经 也是守护进程安全的,一并这么性能损耗,一般倾向于使用这你這個。

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

结果:

tanggao

tanggao

zsy

zsy1

3346521 3346521

true