饿汉式单例真的会比较占用资源吗

2018-07-09 20:13:38 +08:00
 kerb15

经常看到网上说懒汉式可以做到延时加载,而饿汉式在类加载的时候就会实例化。

但是我们平常在用单例的时候,基本上都是直接 Single.getInstance()的方式去获取实例,懒汉式在我们第一次调用这个方法的时候会实例化,那么饿汉式呢?

饿汉式的单例类是在我们启动虚拟机的时候就加载了,还是在我们第一次调用 Single.getInstance()的时候加载呢?

3476 次点击
所在节点    Java
21 条回复
HypoChen
2018-07-09 20:30:17 +08:00
看你有多少个饿汉了
twogoods
2018-07-09 20:38:04 +08:00
恶汉一开始就加载了 getInstance 只是返回那个已创建的实例而已。既然实例最终都是要用到的,内存终究是要占的,懒汉式代码写起来还复杂,有必要吗?
lihongming
2018-07-09 20:38:17 +08:00
学学静态内部类吧,完美
zjp
2018-07-09 20:40:43 +08:00
网上的文章错了,就这么简单。
一个类只有到被调用(静态方法,静态属性,new(),子类初始化,main 方法还有反射)才会被加载。除了单例中还有其他静态方法被先调用的情况,懒汉饿汉的初始化时机一样。

推荐《深入理解 Java 虚拟机》三手资料简直有毒
zjp
2018-07-09 20:42:22 +08:00
@zjp 还有双重检查锁简直是流毒…搞得那么复杂还不一定写对…
lhx2008
2018-07-09 20:44:59 +08:00
@zjp 双重检查没毛病啊,如果获取单例时间太长不检查在多线程就出问题
两种单例,一种问题就在他调用别的静态方法的话,可能会意外加载
sagaxu
2018-07-09 20:50:22 +08:00
@zjp 双检测在 java 1.5 之后是很容易写对的
abcbuzhiming
2018-07-09 20:59:10 +08:00
我一直不明白这个时代用懒加载还有意义吗?无非就是第一次启动快一点罢了
zjp
2018-07-09 21:13:25 +08:00
@lhx2008
@sagaxu
主要是有简单的方法不用,去弄得那么复杂。而且在现在有偏向锁和各种锁优化的情况去看双重检查就觉得有点过度优化了
我一开始写就漏了 volatile 修饰
cyspy
2018-07-09 21:20:12 +08:00
如果你有一千个需要单例的对象,其中几百个可能很久都用不到,显然应该用懒加载。但大多数情况下只需要几个单例而且必须用到,显然没区别。
springGun
2018-07-09 23:40:09 +08:00
饿汉式 classLoader 第一次加载.class 创建吗?
lihongjie0209
2018-07-10 09:05:19 +08:00
先用最简单的饿汉, 如果真的发现内存不够用了, 再优化嘛
zhouquan03
2018-07-10 09:59:07 +08:00
推荐静态内部类方式,简单易懂。
kerb15
2018-07-10 10:15:35 +08:00
@lihongming @zhouquan03 目前开发中确实是用静态内部类的方式去实现单例的
kerb15
2018-07-10 10:18:53 +08:00
@zjp 周志明那本书吗
crayygy
2018-07-10 10:46:58 +08:00
Effective Java 推荐使用静态内部类,综合来看的话,这种的确是最简洁也最方便的写法
zjp
2018-07-10 12:14:20 +08:00
@kerb15
luoyou1014
2018-07-10 12:54:29 +08:00
没有吐槽这个名词吗, 我记得我学习的时候都是用的贪婪加载, 懒加载, 或者叫即时加载和延时加载.

咋现在叫懒汉和饿汉了, 感觉好没文化...
kerb15
2018-07-10 13:15:57 +08:00
@luoyou1014 哈,我第一次接触都是这么叫的
reus
2018-07-10 15:14:41 +08:00
@luoyou1014 是哪个培训班老师起的名字吧,难听

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/469375

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX