三种单例模式实现介绍
三种单例模式实现介绍
假如面试时问到实现三种单例模式相关的知识,回答围绕懒汉式单例、饿汉式单例、双重检查等就可以了,下面我给大家详细回答一下这些知识点。
单例模式定义:确保一个类只有一个实例,并提供一个访问它的全局访问点!
懒汉,线程不安全
这种写法可以在多线程中很好地工作,看起来也有很好的lazyloading。但遗憾的是效率很低,99%不需要同步。
饿汉
这种方法基于classloder机制避免了多线程同步问题,instance在类装载中实例化。现在java单例是指一台虚拟机的范围,因为装载类的功能是虚拟机,所以当一台虚拟机通过自己的ClassLoader装载饿汉式来实现单例类时,就会创建一个类实例。
这意味着虚拟机中有许多classLoader,如果这些classloader可以装载某一类,即使这一类是单一的,也可以产生许多实例。当然,如果一台机器上有很多虚拟机,每台虚拟机中至少有一个这样的例子,那么它就不会是单一的例子。
静态内部类
这种方法还利用classloder的机制来增加instance初始化时只有一个线程。这种方法装载了Singleton类,instance不一定初始化。由于SingletonHolder类没有被主动使用,只有当显示通过调用getinstance方法时,才会显示装载SingletonHolder类,从而实例化instance。
想象一下,如果instance实例消耗资源,我想让他延迟加载!此时,与第二种方法相比,这种方法非常合理。
枚举
这是EffectiveJava作者JoshBloch所倡导的一种方式,它不仅可以避免多线程同步的问题,而且可以防止反序列化重新创建新的对象,可谓是非常坚强的壁垒啊,不过,个人认为由于1.5中加入了enum特性,用这种方式写不免让人觉得生疏,在实际工作中,我也很少看到有人这样写。
双重校验锁(jdk1.5)
这样就可以安全地创建线程实例,而不会对性能产生太大影响。这只是次创建实例时同步,以后就不需要同步了。
因为volatile关键词屏蔽了虚拟机中一些必要的代码优化,运行效率不是很高,建议不要使用。不建议大量使用双重检查锁的单例,根据情况决定。
尊重原创文章,转载请注明出处与链接:http://www.mxiao.cn/1541/new/138792/违者必究!
以上就是洛阳达内教育IT培训中心 小编为您整理三种单例模式实现介绍的全部内容。