单例模式(懒)写法整理(改之前标题“最佳写法”)
2016-03-28 14:29
288 查看
转载请标明出处:
/article/7703809.html;
本文出自: 【温利东的博客】
之所以想写这个问题,是因为之前网上很多都是这样的代码:
这种写法线程不安全,改进一下,加一个同步锁(双重校验):
网上这样的代码更多,可以很好的工作,这种方式可以很好的降低同步锁的开销,但会出现 当线程A和B 执行时,B线程将看到一个还没有被初始化的对象的问题。
。
实际上,早在JDK1.5就引入volatile关键字,所以又有了一种更好的双重校验锁写法:
好处:
1.通过双重检查锁定来降低同步的开销;
2.保证多线程并发执行,采用
还有一种写法:
内部类能使之 延迟初始化(lazy initialization),并且多线程安全,还能保证高性能。
不是说第一、二种写法有问题,或者在Android中一定要用第三或第四种写法,只是告诉大家有更好的写法。
以上就是我的一点小小记录,希望对你有所帮助。
转载请标明出处:
/article/7703809.html;
本文出自: 【温利东的博客】
参考:http://www.infoq.com/cn/articles/double-checked-locking-with-delay-initialization;
http://www.ibm.com/developerworks/java/library/j-jtp06197/index.html;
http://wiki.jikexueyuan.com/project/java-concurrency/synchronized-and-volatile.html;
http://www.race604.com/java-double-checked-singleton/;
/article/7703809.html;
本文出自: 【温利东的博客】
之所以想写这个问题,是因为之前网上很多都是这样的代码:
private static MyApplication instance; public static MyApplication getInstance() { if (instance == null) { instance = new MyApplication(); } return instance; }
这种写法线程不安全,改进一下,加一个同步锁(双重校验):
private static MyApplication instance; public static MyApplication getInstance() { if (instance == null) { synchronized (MyApplication.class) { if (instance == null) { instance = new MyApplication(); } } } return instance; }
网上这样的代码更多,可以很好的工作,这种方式可以很好的降低同步锁的开销,但会出现 当线程A和B 执行时,B线程将看到一个还没有被初始化的对象的问题。
。
实际上,早在JDK1.5就引入volatile关键字,所以又有了一种更好的双重校验锁写法:
private volatile static MyApplication instance; public static MyApplication getInstance() { if (instance == null) { synchronized (MyApplication.class) { if (instance == null) { instance = new MyApplication(); } } } return instance; }
好处:
1.通过双重检查锁定来降低同步的开销;
2.保证多线程并发执行,采用
volatile不会出现第二种方法说的那个问题.
还有一种写法:
class Foo { private static class HelperHolder { public static final MyApplication helper = new MyApplication(); } public static MyApplication getHelper() { return HelperHolder.helper; } }
内部类能使之 延迟初始化(lazy initialization),并且多线程安全,还能保证高性能。
不是说第一、二种写法有问题,或者在Android中一定要用第三或第四种写法,只是告诉大家有更好的写法。
以上就是我的一点小小记录,希望对你有所帮助。
转载请标明出处:
/article/7703809.html;
本文出自: 【温利东的博客】
参考:http://www.infoq.com/cn/articles/double-checked-locking-with-delay-initialization;
http://www.ibm.com/developerworks/java/library/j-jtp06197/index.html;
http://wiki.jikexueyuan.com/project/java-concurrency/synchronized-and-volatile.html;
http://www.race604.com/java-double-checked-singleton/;
相关文章推荐
- 码农小汪-Hibernate学习3-Mapping declaration 映射定义
- C语言学习笔记之格式化I/O(scanf函数、printf函数)
- 15位随机数由大到小依次排序程序
- 又到清明节
- 解决HP打印机错误:Couldn't open fifo
- linux中的监控,测试和优化
- Android总结 - Menu
- Android快速入门
- vb中两个数的比较
- [转载]ubuntu Atheros Communications Device 1083 驱动
- 第四次作业2
- [Android Studio] Gradle项目中添加JNI生成文件(.so文件)
- 并发编程初体验
- angularjs $resource请求类型和请求参数
- java.lang.ClassCastException: android.app.Application cannot be cast to
- iOS 开发中常用的第三方下载地址整理
- PMBOK CMMI IPD Scrum 关系
- 更改默认浏览器
- QT中XML增删改查,不会有重复beta
- TextWatcher详解,限制输入字符,实现文本框输入框同步,TextView与EditText同步显示