专栏名称: java一日一条
主要是讲解编程语言java,并且每天都推送一条关于java编程语言的信息
目录
相关文章推荐
芋道源码  ·  分享一次 ShardingJDBC ... ·  13 小时前  
Java编程精选  ·  CEO裁员后不理解:原来100个人干50个人 ... ·  昨天  
芋道源码  ·  Spring-Security ... ·  3 天前  
51好读  ›  专栏  ›  java一日一条

面试中单例模式有几种写法

java一日一条  · 公众号  · Java  · 2017-11-22 08:30

正文

请到「今天看啥」查看全文


饱汉 – 变种 2

变种2是“臭名昭著”的DCL 1.0。

针对变种1中单例初始化后锁仍然无法避开的问题,变种2在变种1的外层又套了一层check,加上synchronized内层的check,即所谓“双重检查锁”(Double Check Lock,简称DCL)。

变种2的核心是DCL,看起来变种2似乎已经达到了理想的效果:懒加载+线程安全。可惜的是,正如注释中所说,DCL仍然是线程不安全的,由于指令重排序,你可能会得到“半个对象”。详细在看完变种3后,可参考猴子之前的一篇文章,这里不再赘述。

参考:volatile关键字的作用、原理(https://monkeysayhi.github.io/2016/11/29/volatile关键字的作用、原理/)。

饱汉 – 变种 3

变种3专门针对变种2,可谓DCL 2.0。

针对变种3的“半个对象”问题,变种3在instance上增加了volatile关键字,原理见上述参考。

多线程环境下,变种3更适用于性能敏感的场景。但后面我们将了解到,就算是线程安全的,还有一些办法能破坏单例。

饿汉模式

与饱汉相对,饿汉很饿,只想着尽早吃到。所以他就在最早的时机,即类加载时初始化单例,以后访问时直接返回即可。

饿汉的好处是天生的线程安全(得益于类加载机制),写起来超级简单,使用时没有延迟;坏处是有可能造成资源浪费(如果类加载后就一直不使用单例的话)。







请到「今天看啥」查看全文