经常看到网上说懒汉式可以做到延时加载,而饿汉式在类加载的时候就会实例化。
但是我们平常在用单例的时候,基本上都是直接 Single.getInstance()的方式去获取实例,懒汉式在我们第一次调用这个方法的时候会实例化,那么饿汉式呢?
饿汉式的单例类是在我们启动虚拟机的时候就加载了,还是在我们第一次调用 Single.getInstance()的时候加载呢?
1
HypoChen 2018-07-09 20:30:17 +08:00
看你有多少个饿汉了
|
2
twogoods 2018-07-09 20:38:04 +08:00
恶汉一开始就加载了 getInstance 只是返回那个已创建的实例而已。既然实例最终都是要用到的,内存终究是要占的,懒汉式代码写起来还复杂,有必要吗?
|
3
lihongming 2018-07-09 20:38:17 +08:00 via Android
学学静态内部类吧,完美
|
4
zjp 2018-07-09 20:40:43 +08:00 via Android 1
网上的文章错了,就这么简单。
一个类只有到被调用(静态方法,静态属性,new(),子类初始化,main 方法还有反射)才会被加载。除了单例中还有其他静态方法被先调用的情况,懒汉饿汉的初始化时机一样。 推荐《深入理解 Java 虚拟机》三手资料简直有毒 |
6
lhx2008 2018-07-09 20:44:59 +08:00 via Android
@zjp 双重检查没毛病啊,如果获取单例时间太长不检查在多线程就出问题
两种单例,一种问题就在他调用别的静态方法的话,可能会意外加载 |
8
abcbuzhiming 2018-07-09 20:59:10 +08:00
我一直不明白这个时代用懒加载还有意义吗?无非就是第一次启动快一点罢了
|
9
zjp 2018-07-09 21:13:25 +08:00 via Android
|
10
cyspy 2018-07-09 21:20:12 +08:00 via Android
如果你有一千个需要单例的对象,其中几百个可能很久都用不到,显然应该用懒加载。但大多数情况下只需要几个单例而且必须用到,显然没区别。
|
11
springGun 2018-07-09 23:40:09 +08:00
饿汉式 classLoader 第一次加载.class 创建吗?
|
12
lihongjie0209 2018-07-10 09:05:19 +08:00
先用最简单的饿汉, 如果真的发现内存不够用了, 再优化嘛
|
13
zhouquan03 2018-07-10 09:59:07 +08:00
推荐静态内部类方式,简单易懂。
|
14
kerb15 OP @lihongming @zhouquan03 目前开发中确实是用静态内部类的方式去实现单例的
|
16
crayygy 2018-07-10 10:46:58 +08:00 via iPhone
Effective Java 推荐使用静态内部类,综合来看的话,这种的确是最简洁也最方便的写法
|
18
luoyou1014 2018-07-10 12:54:29 +08:00
没有吐槽这个名词吗, 我记得我学习的时候都是用的贪婪加载, 懒加载, 或者叫即时加载和延时加载.
咋现在叫懒汉和饿汉了, 感觉好没文化... |
19
kerb15 OP @luoyou1014 哈,我第一次接触都是这么叫的
|
20
reus 2018-07-10 15:14:41 +08:00
@luoyou1014 是哪个培训班老师起的名字吧,难听
|
21
zjl11 2018-07-20 15:08:05 +08:00 1
推荐使用 enum 做单利
|