JiveJdon Community Forums
在线259人   首页   主题表   培训咨询   标签   精华   查搜   注册    登陆 RSS
首页 » 论坛 » 设计模式、框架和架构
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表
???en_US.forumThreadNext.name??? 下一主题
Go 总共有 4 回复 / 1
 发表新帖子   回复该主题贴
eseasky

悄悄话
发表文章: 2
注册时间: 2006年08月27日 12:45
这把锁有必要吗? 2006年08月27日 12:55 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
标签列表 同步或锁(25)      singleton模式(46)     
今天有空看了Double-checked locking and the Singleton pattern这篇文章.当看到
Double-checked locking: Take two

Given that the current double-checked locking code does not work, I've put together another version of the code, shown in Listing 7, to try to prevent the out-of-order write problem you just saw.


Listing 7. Attempting to solve the out-of-order write problem
这里时产生一个疑问.
eseasky

悄悄话
发表文章: 2
注册时间: 2006年08月27日 12:45
Re: 这把锁有必要吗? 2006年08月27日 13:05 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
不好意思,问题没说完还,继续说

对下面代码
public static Singleton getInstance()
{
if (instance == null)
{
synchronized(Singleton.class) { //1
Singleton inst = instance; //2
if (inst == null)
{
synchronized(Singleton.class) { //3
inst = new Singleton(); //4
}
instance = inst; //5
}
}
}
return instance;
}
中的第二把锁是不是有必要的问题,个人认为可以将上面代码改成如下:
public static Singleton getInstance()
{
if (instance == null)
{
synchronized(Singleton.class) { //1
Singleton inst = instance; //2
if (inst == null)
{
inst = new Singleton(); //3

instance = inst; //4
}
}
}
return instance;
}


我分析了一下,修改后的代码一样能实现解决"solve the out-of-order write problem" 的目的,同时跟修改前相比少一把锁的开销.
个人浅见,还望各位高手不吝指正,谢谢!
banq

悄悄话
发表文章: 9528
注册时间: 2002年08月03日 17:08
Re: 这把锁有必要吗? 2006年08月28日 10:37 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
单态问题在实际中一般是回避的。

对象都是有生命周期的,没有一个永恒的对象,只有对象有生命周期,软件才有生命,所以使用单态很容易强行扭曲对象的生命周期,使其“万岁”。

更何况单态的双锁研究,就象研究数据库连接池一样,意义不大,个人意见。
luyinquan

悄悄话
发表文章: 2
注册时间: 2006年07月12日 17:26
Re: 这把锁有必要吗? 2006年08月28日 16:54 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
更何况单态的双锁研究,就象研究数据库连接池一样,意义不大,个人意见。
小弟不懂
请问baql大师怎么理解,数据库连接用连接池很多,为何连接池的意义不大?
banq

悄悄话
发表文章: 9528
注册时间: 2002年08月03日 17:08
Re: 这把锁有必要吗? 2006年08月29日 10:16 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
不是大师,个人意见。

软件研究需要站在前人基础上,从模式入手、注重应用,数据库连接池是一种Pool模式,现在J2EE应用中,Pool模式是一个基本基础模式,必然需要使用的,我们精力放在模式使用场景研究上即可,如果将精力放在数据库连接池如何做上面,而不是如何用,显然将关注焦点对错了。

这种思维方式其实在很多人身上有,我以前举例过,大师候捷曾经发表一篇Collection内部字节码研究文章,这显然也是向内部关注的思维习惯,我们的精力有限,如果不注重如何使用,也就是模式,软件领域那么技术,不可能也没有必要逐个打开它们,看它们内部原理,换在10年前,我们还可以打开汇编语言或二进制代码研究一下原理,现在几乎不可能,就只能将其作为一个Box,探讨Box应用场景,我们称之为模式。

所以,我个人总结了:搞Java需要有一个向上拔高的思维,也就是架构模式思维,你不会做数据库连接池,但是你知道有池模式,你会用,而且用得恰到好处,后者就是关键了。

回到双锁上面来,单态是邪恶的已经在本站讨论过,单态模式其实是反模式,不是模式,现在我们都使用容器来管理对象生命,对象都是鲜活的,而不是一个全局变量或死鱼一个。

那么基于单态实现的双锁是否有效,能否达到真正单态等研究都意义不大,而且会陷入象数据库;连接池如何实现那样的怪圈。

以上只是个人意见,权当参考。

这个主题有 4 回复 / 1Go
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表    返回页首返回页首
???en_US.forumThreadNext.name??? 下一主题
热点TAG: AOP cache 缓存 DDD EJB 集群 设计模式 Hibernate IOC JiveJdon OO RBAC Seam Spring Struts
正在读取,请等待...
google yahoo 新浪ViVi 365Key网摘 天极网摘 CSDN网摘 添加到百度搜藏 POCO网摘 博采网摘
查询本论坛内 回复超过的热门帖子
     回复该主题贴
标题
 
粗体 斜体 下划线 插入图片 插入代码 插入url链接 插入附件
内容
  每2分种自动备份发贴内容Ctrl-V粘贴取出,提问题前先查询标签列表

RSS 手机阅读 add to google add to yahoo
解惑之道在J道 ,打造中国最具影响力的的企业软件社区
OpenSource JIVEJDON v3.0 Powered by JdonFramework Code © 2002-08 jdon.com

anti spam