单例模式中,懒汉式和饿汉式的区别

superyf123 2007-11-11 02:18:56
单例模式中,饿汉式和懒汉式有什么区别?各适合用在哪里?为什么说推荐用饿汉模式?
...全文
32692 51 打赏 收藏 转发到动态 举报
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
dengbin50 2012-07-23
  • 打赏
  • 举报
回复
32楼说的是对的,18楼那样没有意义!!
石头666 2012-07-20
  • 打赏
  • 举报
回复
单例模式在java中不常用吧,好像在单片机中用的多
人走茶凉 2012-04-09
  • 打赏
  • 举报
回复
学习……顶了
jsp853899857 2012-02-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 blue_winding 的回复:]
饿汉式:
public class Singleton{
private static Singleton singleton = new Singleton ();
private Singleton (){}
public Singleton getInstance(){return si……
[/Quote]

正解
huyou133 2011-12-21
  • 打赏
  • 举报
回复
学习了
cs362367886dn 2011-10-15
  • 打赏
  • 举报
回复
搞错了,,,private的成员不是final,private的方法才是final的,,,
cs362367886dn 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 yaray 的回复:]

饿汉式在声明实例变量时不加final关键字,并且非正常使用时可能存在问题
[/Quote]
这里错了一点,事实上private的成员默认就是final的,这个在Thinking in java一书中多次有提及

还有个就是
【引用】
Singleton s = Singleton.getInstance();
s.executeMethod();
s = null; // 非正常使用
【/引用】
s = null; 事实上是正常的使用,他只是把“s”这个的引用设置成空,并没有影响到Singleton 中的instance对象

这里主要涉及一个对象赋值的问题,
Singleton s = Singleton.getInstance();是把instance 的引用赋值给s,让s与instance 都指向同一块内存存储区域【这个区域就是在instance = new Singleton();的时候为instance开辟的】
s = null; 就是让s不再指向这那里,而这完全不影响instance【因为你并没有设置instance =null】,
在之后的第二个用户调用Singleton.getInstance()的时候,仍然同s = Singleton.getInstance()一样,仍是将instence的引用copy一份给他(第二个用户)。
我是这么理解的,不对的地方望指正
biantiandiyun 2011-07-26
  • 打赏
  • 举报
回复
跟楼上有相同疑问
wsh900221 2011-07-04
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 keeya0416 的回复:]
引用 18 楼 yaray 的回复:
Java codepublicclass Singleton {privatefinalstatic Singleton instance=new Singleton();private Singleton(){}publicstatic Singleton getInstance() {return instance;
}publicvoid execu……
[/Quote]
18楼的我试了试,可能用的工具不同,或者环境也不同吧,你说的NullPointException我这出不来,一切运行正常,why?技术更新了??
trx999 2011-05-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 since1978 的回复:]
饿汉式无需关注多线程问题、写法简单明了、能用则用。但是它是加载类时创建实例(上面有个朋友写错了)、所以如果是一个工厂模式、缓存了很多实例、那么就得考虑效率问题,因为这个类一加载则把所有实例不管用不用一块创建。
懒汉式的优点是延时加载、缺点是应该用同步(想改进的话现在还是不可能,比如double-check)、其实也可以不用同步、看你的需求了,多创建一两个无引用的废对象其实也没什么大不了。
[/Quote]


如果是高并发,你这个就不行了.不要小看这一两个无引用的废对象,其实他们是影响效率的关键部分
QQ635785620 2011-02-25
  • 打赏
  • 举报
回复
单例模式!
签约梦想 2010-09-16
  • 打赏
  • 举报
回复
学习了 顶
yiqiyou 2010-01-27
  • 打赏
  • 举报
回复
原来一个单例模式有这么多的名堂,太学习了
SambaGao 2010-01-24
  • 打赏
  • 举报
回复
学习了。
绝对零度9527 2010-01-22
  • 打赏
  • 举报
回复
请问楼主在看的书是什么啊?设计模式?
tuerqizhou 2010-01-21
  • 打赏
  • 举报
回复
hehe
还可以这样用啊
klose1118 2010-01-21
  • 打赏
  • 举报
回复
mark
yang677888 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 yaray 的回复:]
Java codepublicclass Singleton {privatefinalstatic Singleton instance=new Singleton();private Singleton(){}publicstatic Singleton getInstance() {return instance;
}publicvoid executeMethod(...) {
...
}
}
饿汉式在声明实例变量时不加final关键字,并且非正常使用时可能存在问题:

第一个人使用时:
Java code
Singleton s= Singleton.getInstance();
s.executeMethod();
s=null;// 非正常使用

当另一个人使用时:
Java code
Singleton s= Singleton.getInstance();
s.executeMethod();// throw a NullPointException


懒汉式则不存在此问题:
Java codepublicclass Singleton {privatestatic Singleton instance=new Singleton();privatestatic Object synObject=new Object();private Singleton(){}publicstatic Singleton getInstance() {if (instance!=null) {return instance;
}synchronized(synObject) {if (instance==null) {
instance=new Singleton();
}
}return instance;
}publicvoid executeMethod(...) {
...
}
}
[/Quote]不错
ScAREcrOw_ss 2010-01-21
  • 打赏
  • 举报
回复
双重检查成例对Java语言编译器不成立

在 C 语言里得到普遍应用的双重检查成例在多数的 Java语言编译器里
面并不成立[BLOCH01, GOETZ01, DCL01]。使用了双重检查成例的“懒汉式”单例类,
不能工作的基本原因在于,在 Java编译器中,LazySingleton类的初始化与单例变量
赋值的顺序不可预料。如果一个线程在没有同步化的条件下读取 单例变量 引用,并调用
这个对象的方法的话,可能会发现对象的初始化过程尚未完成,从而造成崩溃。
文献[BLOCH01]指出:一般而言,双重检查成立对 Java 语言来说是不成立的。
ScAREcrOw_ss 2010-01-21
  • 打赏
  • 举报
回复
饿汉式单例类在自己被加载时就将自己实例化。即便加载器是静态的,在饿汉式单例
类被加载时仍会将自己实例化。单从资源利用效率角度来讲,这个比懒汉式单例类稍差些。
从速度和反应时间角度来讲,则比懒汉式单例类稍好些。然而,懒汉式单例类在实例化时,
必须处理好在多个线程同时首次引用此类时的访问限制问题,特别是当单例类作为资源控
制器,在实例化时必然涉及资源初始化,而资源初始化很有可能耗费时间。这意味着出现
多线程同时首次引用此类的机率变得较大。
饿汉式单例类可以在 Java 语言内实现,但不易在 C++内实现,因为静态初始化在 C++
里没有固定的顺序,因而静态的 m_instance 变量的初始化与类的加载顺序没有保证,可能
会出问题。饿汉式单例类更符合 Java 语言本身的特点。
加载更多回复(31)

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧