双重检验锁定单例模式的优化写法(非volatile,全版本jvm通用)
2017-01-07 00:37
253 查看
首先介绍下普通的双重检查锁定:
图中这样的代码是有问题的,因为jvm存在无序写入,在代码sInstance = new TestSingleTon() 这一处,有可能在构造函数执行前sInstance变为非null,这时的sInstance指向是一个尚未构造完成的对象,这时其他线程可能会得到一个尚未初始化完成的对象,对这个对象进行操作是会出现问题的;
针对可能出现上述无序写入问题,我研究出了双重检查的优化写法:
尽管jvm存在无序写入,但只有当对象构造完成checkSInstanceIsNul才会为非null,其他线程永远只会获的完整构造的对象。
此方法是我独创的写法,既解决了同步带来的开销问题,又解决了懒加载问题,而且在jvm1.5以前也是可用的(volitile在1.5以前的实现有问题,所以使用volatile不能解决问题)。
图中这样的代码是有问题的,因为jvm存在无序写入,在代码sInstance = new TestSingleTon() 这一处,有可能在构造函数执行前sInstance变为非null,这时的sInstance指向是一个尚未构造完成的对象,这时其他线程可能会得到一个尚未初始化完成的对象,对这个对象进行操作是会出现问题的;
针对可能出现上述无序写入问题,我研究出了双重检查的优化写法:
尽管jvm存在无序写入,但只有当对象构造完成checkSInstanceIsNul才会为非null,其他线程永远只会获的完整构造的对象。
此方法是我独创的写法,既解决了同步带来的开销问题,又解决了懒加载问题,而且在jvm1.5以前也是可用的(volitile在1.5以前的实现有问题,所以使用volatile不能解决问题)。
相关文章推荐
- MySQL 优化
- 5分钟了解MySQL5.7对in用法有什么黑科技
- Google排名优化的几个影响因素
- DB2优化(简易版)
- Mysql limit 优化,百万至千万级快速分页 复合索引的引用并应用于轻量级框架
- C#中尾递归的使用、优化及编译器优化
- 对优化Ruby on Rails性能的一些办法的探究
- 优化Ruby脚本效率实例分享
- Asp编码优化技巧
- 如何监测和优化OLAP数据库
- mysql -参数thread_cache_size优化方法 小结
- MySQL数据库优化技术之配置技巧总结
- Oracle数据库中SQL语句的优化技巧
- 深入学习SQL Server聚合函数算法优化技巧
- c#单例模式(Singleton)的6种实现
- MySQL常见的底层优化操作教程及相关建议
- 详解mysql的limit经典用法及优化实例
- Mysql Limit 分页查询优化详解
- 数据库学习建议之提高数据库速度的十条建议
- oracle数据库sql的优化总结