论坛首页 入门技术论坛

如此使用单例模式!

浏览 27403 次
该帖已经被评为新手帖
作者 正文
   发表时间:2009-02-04   最后修改:2009-02-05
pipilu 写道
vampire423 写道
zozoh 写道
#     public static UserRule getInstance() {  
#         if (instance == null) {  
#             instance = new UserRule();  
#         }  
#         return instance;  
#     }

应该写成
public static UserRule getInstance() {  
if (instance == null) {
synchronized(UserRule.class){
if (instance == null){
instance = new UserRule();
}
}
}  
return instance;  
}

以保证多个线程访问的安全



Java中使用单例模式中必须像这样进行双重检查,否则会出现多线程问题


太扯了。
双重检查只是为了避免以后访问此方法时的性能问题——因为只有第一次创建实例时,才需要同步锁。
自己看看去吧:http://www.ibm.com/developerworks/cn/java/j-dcl.html


0 请登录后投票
   发表时间:2009-02-05  
双重检查成例现在JVM已经可以支持了吗?以前是不可以的,见[BLOCH01,GOETZ01,DCL01]
0 请登录后投票
   发表时间:2009-02-09  
zozoh 是标准的教科书写法  可以解决多线程问题
0 请登录后投票
   发表时间:2009-02-10  
好像这个单例 缺少私有的构造器啊!
0 请登录后投票
   发表时间:2009-02-10  
ferry2174 写道
单例的意思就是说在应用程序中只存在一个此类的实例,不管使用什么方法,能保证这个条件就是单例,没必要非得按照什么格式来写。一个单例中只要没有全局变量,那么在业务处理时也就没什么线程不安全的问题,问题只是存在第一次调用getInstance()方法时,大不了在系统加载时就调用此类的getInstance()方法,就自然不会产生线程安全的问题。JAVA程序的性能瓶颈大多在数据库,我想我不会在乎使用synchronized这0.1秒的性能损失的,而且这0.1秒不知道可以创建一个多么大的对象了。

这个单例在使用上的问题在于楼主说的“贫血设计”上。UserRule这个类看起来应该是个session类,不同于一般“util”类,它是负责业务操作的。如果程序很简单、规则是单一的这么写也无可厚非。一旦碰到稍微复杂的业务逻辑,不能使用多态那么对依赖于此类的其他类维护起来就是灾难性的,所谓的发散式修改会一直伴随在这个类的生命周期中。以上只是在假定此类是业务处理类而非工具类的基础上做出,要从设计的角度来评价这个类的好坏还得看他在应用中所处的位置和所起的作用,这是楼主没有给的。

从这个类中我并没看出什么性能问题来,这样设计会让此类在应用生命周期中只创建一次,能提升性能。真正的性能问题要综合全局来看才能有结论。


在单粒模式下,不同的线程如何通过相同的实例找到各自的局部变量值啊?
0 请登录后投票
   发表时间:2009-02-10  
czqyr 写道
它不是单例模式已经知道了
但我对线程安全不太懂。。。
有什么推荐的文章看一看吗?


我觉得 thinking in java 讲的不错。
0 请登录后投票
   发表时间:2009-02-11  
怎么看不出和单例有什么关系。
0 请登录后投票
   发表时间:2009-02-11  
楼主的示例不是单例模式啊
0 请登录后投票
   发表时间:2009-02-11  
我想请问这里用单例有什么用? 而且单例还写错了,性能方面我觉得应该差不多,但是这样写是线程不安全的。
0 请登录后投票
论坛首页 入门技术版

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