12
返回列表 发新帖
楼主: hanfeishu

多线程安全的单例代码中,为何要两次判断是否为null

[复制链接]
论坛徽章:
0
11#
发表于 2009-3-31 13:12 | 只看该作者
private static synchronized void syncInit() {
if (instance == null) {
instance = new GlobalConfig();
}
}
public static GlobalConfig getInstance() {
if (instance==null) {
syncInit();
}
return instance;
}

即使getInstance里面没有判断 是否null  ,instance也不可能被初始化第二次
静态同步方法已经保证了其原子性   所以getInstance里面的判断只是为了第一次的初始化, 当然因为getInstance本身没有同步 所以运行速度快些,
它把同步的任务交给了 syncInit
即使多个线程同时进入 if (instance==null) { 内部   但是在调用syncInit之前
也只有第一个进入syncInit的线程会初始化instance 其他的进入后就出来了 不做任何事情

其实可以改代码为:

public static synchronized  GlobalConfig getInstance() {
if (instance==null) {
instance = new GlobalConfig();
}
return instance;
}


这样子也是线程安全的 但是这样子的话以后每次都要同步运行 getInstance  运行效率会降低
所以之前的代码把getInstance和同步分离了 可以提高运行效率  只要以后线程发现instance不是null 就不会去调用那个同步化的方法了

使用道具 举报

回复
论坛徽章:
0
12#
发表于 2009-5-4 12:58 | 只看该作者

回复 #11 linuxtyh 的帖子

你的做法并不是安全的做法……这是为了解决JMM里面一个Double Check Lock的问题,看看下面的链接你就明白了:
http://www.cs.umd.edu/~pugh/java ... CheckedLocking.html

使用道具 举报

回复
论坛徽章:
0
13#
发表于 2009-5-7 16:18 | 只看该作者
多注意点是好的

使用道具 举报

回复
论坛徽章:
0
14#
发表于 2009-5-8 11:35 | 只看该作者
为了回复 我注册了ID

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表