Double Check形式的单例模式
来源:互联网 发布:c语言菜单设计模板 编辑:程序博客网 时间:2024/05/22 15:33
这两天在看开源项目时,发现Event Bus和Universalimageloader中写单例模式都是Double Check的形式。平时总是看到各种各样的单例模式,如,饿汉式,懒汉式等等。其中大多存在问题。今天记录一种比较优秀的单例模式的写法------Double Check。以后我准备就用这种方法了。(虽然还有其他优秀的方式,比如内部静态类,枚举)
先上代码:
public class ImageLoader {private volatile static ImageLoader instance;// Returns singleton class instancepublic static ImageLoader getInstance() {if (instance == null) {synchronized (ImageLoader.class) {if (instance == null) {instance = new ImageLoader();}}}return instance;}}
这是EventBus中的代码。其中两次检查是否instance == null,第一个是为了避免每次都加锁,毕竟这有一定的开销。第二个是为了避免同步问题,比如十个线程同时调用getInstance()方法,都执行了第一步检查instance == null,并且其中一个线程成功获得了锁(执行了synchronized语句),接下来如果没有再一次判断instance == null,则十个线程将生成10对象,这违背了单例的初衷。
上述代码除了有两次检查instance == null,另一个特点是变量instance的类型声明中添加了volatile,因为像下面这种创建对象的语句并不是原子操作,volatile可以使其成为原子操作,避免同步问题。
instance = new ImageLoader();
虽说部分JVM没有完全volatile,但是目前主流的JVM貌似已经都支持了,所以这个问题一般可以忽略。
参考:
http://www.zhihu.com/question/29971746
https://www.v2ex.com/t/193589#reply15
0 0
- Double Check形式的单例模式
- 单例模式下的double check
- 单例的double-check
- 从单例模式的Double-Check看指令重排
- 单例设计模式---double check原因
- 单例模式中的Double check lock
- 单例模式与double check
- 单例模式中的 双重检查锁定(Double-Check Locking )
- 单例模式中的 双重检查锁定(Double-Check Locking )
- 在多线程中创建单例模式的双重锁定(Double-Check Locking )
- Java使用double check(双重检查)实现单例模式的一个小细节
- 单例模式中的 双重检查锁定(Double-Check Locking ) (多线程下单例模式中的双重检查锁定的实现)
- double check与staitc单例
- 单例及double check lock
- 并发控制(3) 使用double check方式的单例,来确保并发下的线程安全的单例模式
- 单例形式模式
- 单例模式的三种形式
- 单例模式的最高级形式
- log4cxx在linux下的编译使用
- Hadoop小程序测试方法
- MySQL安装
- Cocos2d-x 多分辨率适配完全解析
- PHP Filter 函数中文注解
- Double Check形式的单例模式
- Android 中对于图片的内存优化方法
- Hadoop集群搭建遇上的问题
- 多边形裁剪圆的实现细节之求直线段与圆的交点
- Android 获取本地外网IP、内网IP、计算机名等信息
- IDF实验室:倒行逆施--python ByteCode
- Java 类的继承
- 第十周项目4——类族的设计(3)
- hdu 2833 WuKong【floyd】