java实现懒加载_Java 单例有无必要使用懒加载模式?

所谓『饿汉模式』是指在类加载阶段完成了单实例对象的创建,这一步在类加载的初始化阶段完成,这一阶段,通过调用这一特殊的构造函数对类的静态域进行初始化;所谓『懒汉模式』无非就是单实例类完成初始化之后,静态域仍然是null,需要用户去通过invoke_static指令显式调用getInstance方法去完成对象的创建。

不难发现,如果采用饿汉模式,单实例对象便会在类加载完成之时,常驻堆中,后续访问时本质上是通过该类的Class对象嵌入的intance指针寻址,找到单实例对象的所在。这一模式的好处在于:1、通过空间换时间,避免了后续访问时由于对象的构造带来的时间上的开销;2、 无需考虑多线程的并发问题,JVM在类加载过程中,会通过内部加锁机制保证加载类的全局唯一性。不好的地方,就是不管你用还是不用,只要完成了类加载,Heap中单实例对象所占的内存空间就被占据了,某种程度上,也是内存泄漏的体现。这也是采用『懒汉模式』的由来。

至于DCL(Double-check Locking),那是在『懒汉模式』技术上的性能优化,『懒汉模式』本身由于过度同步导致性能上的下降,而早期JVM——JDK1.5之前,JSR133 JMM未能引入,而导致JVM无法保证程序执行的顺序一致性;在JMM实现后,增强了volatile的语义——通过OrderAccess增加了内存屏障,确保不会出现Out-of-sort的现象,真正实现了DCL。

————————————————————————————

跟题主交流后,得知问题的本意。对于职责单一的单例类;确实,两种实现方式是没啥区别的;但是对于,因反射、自定义加载、或者其他引用导致的单例类被加载的情况,还是有区别的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值