论坛首页 Java企业应用论坛

单例模式与双重检测

浏览 59480 次
精华帖 (1) :: 良好帖 (10) :: 新手帖 (2) :: 隐藏帖 (6)
作者 正文
   发表时间:2010-04-27  
junJZ_2008 写道


最主要的一点就是,线程可能从任何点切换,这个点可能是某两个语句中,也有可能是从语句中中断,这也是完全有可能的。


如果这样,那第二种的时候,我也在new的时候切换,那不是也不能保证线程安全了吗?

ps:我很少做多线程的东西,不是很了解线程安全
0 请登录后投票
   发表时间:2010-04-27  
fengsky491 写道
junJZ_2008 写道


最主要的一点就是,线程可能从任何点切换,这个点可能是某两个语句中,也有可能是从语句中中断,这也是完全有可能的。


如果这样,那第二种的时候,我也在new的时候切换,那不是也不能保证线程安全了吗?

ps:我很少做多线程的东西,不是很了解线程安全


第二种不会的,因为共享的代码块都是放在同步块里的,即在该同步块执行完成后,才能让其他也基于该同步块锁的线程获取锁。双重检测不成立最主要的原因就是 检测 条件不有同步,所以其他线程在执行第一层检测条件时就可能从正在创建对象的线程中抢占CPU,所以就造成了失效
0 请登录后投票
   发表时间:2010-04-27  
也就是说,加上return,也不能保证同步块的原子性,对吗?
0 请登录后投票
   发表时间:2010-04-27  
fengsky491 写道
也就是说,加上return,也不能保证同步块的原子性,对吗?


是的,这与加不加上retrun是没有太大的关系的
0 请登录后投票
   发表时间:2010-04-27  
  好好学习,天天向上!!
0 请登录后投票
   发表时间:2010-04-27  
developwork上也有相关文章,但是理论部分基于5以前的内存模型
http://www.ibm.com/developerworks/cn/java/j-dcl.html

在effective java里的推荐解决方法是用enum写单例,延迟加载,序列化问题都能解决
0 请登录后投票
   发表时间:2010-04-27  
dominic6988 写道
fengsky491 写道
我就想问下,为什么第三种方式,//3没执行完(也就是没有new完整),它为什么会释放锁?

 

 第三步可以看作一个赋值语句,只不过是调用构造函数初始化在付值语句之后。另外一个线程得到锁后就看到当前的instence已经不是null了就直接返回了,这个时候有可能第一个线程初始化工作做了一半,或者没有做。这样后面的线程得到的对像就会有问题。我感觉是这样的。


那是不是JAVA多线程里都不敢写new了???

0 请登录后投票
   发表时间:2010-04-28  
java的构造函数没有执行完以前,即便不在代码中逸出,外界也可以拿到这个对象???奇怪了。。。 而且jdk1.4以后,双检锁不是已经安全了吗?
0 请登录后投票
   发表时间:2010-04-28  
http://dev.csdn.net/author/axman/4c46d233b388419e9d8b025a3c507b17.html
看看这篇吧,你们的理解已经是老黄历了~~
事实上,双检锁已经安全了~~
0 请登录后投票
   发表时间:2010-04-28  
babby52561 写道
http://dev.csdn.net/author/axman/4c46d233b388419e9d8b025a3c507b17.html
看看这篇吧,你们的理解已经是老黄历了~~
事实上,双检锁已经安全了~~

 

 谢谢,这个解释非常清楚.

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics