范文无忧网范文学习范文大全

如何高效的创建一个线程安全的单例

02月10日 编辑 fanwen51.com

[如何做好地税群众性精神文明创建活动](一)、加强组织领导,明确精神文明创建责任精神文明创建是实现“以德治国”,弘扬职业道德有效工作载体,是地税事业发展的动力。基于这种认识,我们从强化领导班子责任入手,实行“一岗...+阅读

单例模式的概念 单例模式就是确保只有一个实例,而且自行实例化并向整个系统传递这个实例,这个类就称作为单例类 单例模式最重要的一个特点就是构造方法私有化。创建单例模式分为懒汉式和饿汉式。 第一种:懒汉式(线程不安全的) 传统的懒汉式创建单例模式,是线程不安全的 [java] view plain copy print? public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 所谓懒汉式单例模式就是在调用的时候才去创建这个实例。

这种写法的懒加载很明显,但是缺点就是不能再多线程访问下正常工作。 第二种:懒汉式(线程安全的) [java] view plain copy print? public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 线程安全的方式创建单例就是在对外的创建实例方法上加上synchronized。

这种写法能够在多线程中很好的工作,而且看起来它也具备很好的lazy loading,但是,遗憾的是,效率很低,99%情况下不需要同步。 第三种:饿汉式(是线程安全的) [java] view plain copy print? public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } } 这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用getInstance方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化instance显然没有达到lazy loading的效果。

第四种:静态内部类的方式创建单例模式(static inner class) [java] view plain copy print? public class Singleton { private Singleton() { } private static class SingletonHolder {// 静态内部类 private static Singleton singleton = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.singleton; } } 这种方式同样利用了classloder的机制来保证初始化instance时只有一个线程,它跟第三种方式不同的是(很细微的差别):第三种方式是只要Singleton类被装载了,那么instance就会被实例化(没有达到lazy loading效果),而这种方式是Singleton类被装载了,instance不一定被初始化。

因为SingletonHolder类没有被主动使用,只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,从而实例化singleton。想象一下,如果实例化singleton很消耗资源,我想让他延迟加载,另外一方面,我不希望在Singleton类加载时就实例化,因为我不能确保Singleton类还可能在其他的地方被主动使用从而被加载,那么这个时候实例化instance显然是不合适的。

这个时候,这种方式相比第三种方式就显得很合理。 第五种:双重校验锁(dubble check instance) [java] view plain copy print? public class Singleton { private static Singleton singleton; private Singleton() { } public static Singleton getInstance(){ if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { /** * 为什么这里会使用双重判定呢? */ singleton = new Singleton(); } } } return singleton; } } 这种事用双重判断来创建一个单例的方法,那么我们为什么要使用两个if判断这个对象当前是不是空的呢 ?因为当有多个线程同时要创建对象的时候,多个线程有可能都停止在第一个if判断的地方,等待锁的释放,然后多个线程就都创建了对象,这样就不是单例模式了,所以我们要用两个if来进行这个对象是否存在的判断。

延伸阅读:

如何推进国有企业廉政文化创建活动1,首先要在领导干部的选拔上把好关,确保选拔的制度化和规范化。2,第二要加强思想教育,提高领导干部认识水平。3,第三要建立健全权力的监督和监管机制,从体制上扼制腐败。【拓展】...

我国采取了哪些措施开展国家食品安全城市创建食品安全是一个全球性的问题,也是中国当前面临的挑战之一。根据问题的重要性来排列,目前我国存在的主要食品安全问题依次为:微生物引起的食源性疾病;农药残留、兽药残留、重金属...

创建文明城市共建和谐家园为主题可以开展哪些活动文明是我们身边不可或缺的身影。他是我们中国象征。在我们身边也有这样的事例。如:在我们的村子里,原来是一条“肮脏”的村子,可是,有一次,让这条村子改变了面目。一天,一个小孩在...

积极参与节约能源创建节约型社会我们还能从哪方面做起众所周知,水、电、土地、能源、原材料等资源是人类赖以生存和发展的基础,是经济社会可持续发展的重要保证。近20年来,我国经济增长了六倍,而资源消耗却增长了几十倍,资源、能源已...

创建校园文明活动的意义高等学校是人类文明成果的重要传播场所,也是展示人类文明的一个窗口。文明校园的建设不仅推动高校的发展,而且事关和谐社会建设的大计。创建“文明校园”既是高校贯彻落实党的...

求帮忙写一篇有关创建卫生城市从我做起从我家做起急用啊!老师们,同学们,今天我国旗下演讲的题目是: 创建文明卫生城市,从我做起。 文明是一种习惯。文明之于一座城,是一种和谐稳定的风尚;文明之于一个人,是一种积极健康的素养。一个人的文...

如何强化基层党组织建设创建基层支部是党的全部工作和战斗力的基础;是党联系群众的桥梁和纽带;是党在社会基层组织中的战斗堡垒。加强基层党支部建设必须提升党员素质、健全组织体系、提升工作能力、广泛...

文明单位创建道德讲堂主题有哪些1、生态文明 美丽中国 “道德讲堂”的主要类型 机关“道德讲堂”:主要对象是机关公务员。以倡导勤政廉政、忠诚负责、知礼守礼等为主要内容。 企业“道德讲堂”:主要对象是企...

防灾减灾创建和谐校园灾害包括主要分为自然灾害和人为灾害,校园的防灾减灾主要针对: 自然灾害 地震——学生的避震疏散,平时的避震疏散知识的宣传教育,及加强绿地、操场、运动场的震时避震功能,加强震...

推荐阅读
图文推荐
栏目列表