范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

实现单例模式的五种方式

  #头条创作挑战赛#前言
  单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,使用单例模式的类只有一个对象实例。1、饿汉单例
  非多线程安全,非懒加载
  饿汉需要直接创建实例。public class HungryHanModel {      private static HungryHanModel hungryHanModel = new HungryHanModel();      private HungryHanModel() {}      public static HungryHanModel getInstance(){         return hungryHanModel;     } }
  缺点: 类加载就初始化,浪费内存
  优点: 没有加锁,执行效率高。还是线程安全的实例
  2、懒汉单例
  非线程安全的懒汉单例,懒加载
  懒汉单例:在类初始化不会创建实例,只有被调用时才会创建实例。public class LazyManMode {      private static LazyManMode lazyManMode;      private LazyManMode() {}      public static LazyManMode getInstance() {         if (lazyManMode == null) {             lazyManMode = new LazyManMode();         }         return lazyManMode;     } }
  实例在调用 getInstance 才会创建实例,优点是不占内存,在单线程模式下,是安全的。但是多线程模式下,多个线程同时执行 if (lazyManMode== null) 进行判空,结果都为 true,会创建多个实例,所以上面的懒汉单例是一个线程不安全的实例。
  3、加同步锁的懒汉单例
  多线程安全,懒加载
  为了解决多个线程同时执行 if (lazyManMode== null) 的问题,getInstance 方法添加同步锁,这样多条线程排队进入了 getInstance 方法,只有执行完毕之后,其他线程才能进入该方法,同一时间只有一个线程才能进入该方法。public class LazyManModeSync {      private static LazyManModeSync lazyManlModeSync;      private LazyManModeSync() {}      public static synchronized LazyManModeSync getInstance() {         if (lazyManlModeSync == null) {             lazyManlModeSync =new LazyManModeSync();         }         return lazyManlModeSync;     } }
  这样配置虽然保证了线程的安全性,但是效率低,只有在第一次调用初始化之后,才需要同步,初始化之后都不需要进行同步。锁的粒度太大,影响了程序的执行效率。
  4、双重检验懒汉单例
  多线程安全,懒加载
  使用 synchronized 声明的方法,在多个线程访问,比如第一条线程访问时,其他线程必须等待第一条线程执行完毕之后才能访问,这样会大大的降低的程序的运行效率。这个时候在加了同步锁的懒汉模式进行锁粒度的一个优化,锁住方法中的部分代码块,优化时间。
  双重检验首先判断实例是否为空,然后使用 synchronized (lazyManModeDoubleCheck.class) 使用类锁,锁住整个类,执行完代码块的代码之后,新建了实例,其他代码都不走 if (lazyManModeDoubleCheck== null) 里面,在最开始的时候程序创建对象效率会低下。而 synchronized 里面再次判断是否可能同时有多个线程都执行到 synchronized (lazyManModeDoubleCheck.class) ,如果其中一条线程线程新建实例,那么其他线程 的lazyManModeDoubleCheck就不为空,就不会再创建实例了。public class LazyManModeDoubleCheck {      private static LazyManModeDoubleCheck lazyManModeDoubleCheck;      private LazyManModeDoubleCheck() {}      public static LazyManModeDoubleCheck getInstance() {         if (lazyManModeDoubleCheck == null) {             synchronized (LazyManModeDoubleCheck.class) {                 if (lazyManModeDoubleCheck == null) {                     lazyManModeDoubleCheck = new LazyManModeDoubleCheck();                 }             }         }         return lazyManModeDoubleCheck;     } }
  5、静态内部类
  多线程安全,懒加载
  外部类加载时,并不会加载内部类,也就不会执行 new CreateASingleInstance(),这属于懒加载。只有第一次调用 getInstance() 方法时才会加载 CreateASingleInstance类。而静态内部类是线程安全的。
  静态内部类为什么是线程安全
  静态内部类利用了类加载机制的初始化阶段 方法,静态内部类的静态变量赋值操作,实际就是一个方法,当执行getInstance() 方法时,虚拟机才会加载 CreateASingleInstance静态内部类,
  然后在加载静态内部类,该内部类有静态变量,JVM会改内部生成方法,然后在初始化执行方法 —— 即执行静态变量的赋值动作。
  虚拟机会保证 方法在多线程环境下使用加锁同步,只会执行一次 方法。
  这种方式不仅实现延迟加载,也保障线程安全。public class StaticInnerClass {      private StaticInnerClass() {}      private static class CreateASingleInstance {         private static final CreateASingleInstance INSTANCE = new CreateASingleInstance();     }      public static final CreateASingleInstance getInstance() {         return CreateASingleInstance.INSTANCE;     } }

突发!安倍晋三胸部中枪倒地,目前已经没有生命体征突发!安倍晋三胸部中枪倒地,目前已经没有生命体征严谨认真地说,这种事情发生了每个人都总是保持一点抑制,尤其是在互联网上,不必说太直接的情绪发泄。每个人对这件事的态度,事实上,你知道女生为啥不能光膀子?家长用漫画还原对话现场,妈妈意外躺枪小学生的想法总是天马行空,当他们接触到一个新鲜的事物时,就会产生较多新奇的想法。鸟为什么会飞?晚上为什么么有太阳?,这些都是小学生对这个世界充满的好奇,而有时面对小学生的童言童语,姨妈因交通事故身亡,外甥女能否索要死亡赔偿金?来源中工网职工郭莉莉近日向本报咨询说,她的姨妈遭遇交通事故,交警部门认定对方司机负全部责任。因其外祖父母早已去世,其姨妈无丈夫无子女,她曾以姨妈唯一亲人的身份,要求对方司机保险公司日本人野心有多大?日本国歌仅28字,翻译成汉语你就明白了日本的国歌国歌与众多歌曲艺术不同,它往往代表着一个国家的精神意志文化,以及它所要传达的一种人文精神。另外,国歌的创作在很大程度上会受到当时的时代背景所影响。例如英美等国的国歌,多受日本首相再次遭到刺杀在日本的近代历史上,日本首相再次遭到刺杀。日本第一代首相伊藤博文,1909年10月26日在我国东北哈尔滨火车站遇刺,当时没有立即死亡,在送往抢救途中因失血过多死亡。历史记录中,伊藤安倍晋三遭枪击心肺停止专家此案足以成为战后日本政治中最大事件环球时报环球网报道记者邢晓婧当地时间8日11时30分许,日本前首相安倍晋三在奈良演讲时突然遭遇枪击。据日媒报道,现处于心肺停止状态。日本问题专家8日对环球时报记者表示,枪击案发生在回顾安倍经济学,日本经济曾从低谷走向黎明根据央视新闻,当地时间8日,日本前首相安倍晋三当天上午在奈良发表演讲时中枪。据媒体报道,安倍晋三在上救护车时还有意识,目前安倍晋三已经没有生命体征。截至北京时间7月8日1254,日日本首相安倍晋三怎么都没有想到一个两次出任日本首相的男人会以这样的方式结束自己的一生!2022年7月8日消息,日本前首相安倍晋三在奈良市进行演讲时胸部中枪,嫌疑人已被控制。另据共同社消息,安倍晋三突发!日本前首相安倍演讲时胸部中枪已无生命体征嫌疑人已被控制突发!日本前首相安倍演讲时胸部中枪已无生命体征嫌疑人已被控制7月8号,终于传来日本的喜讯!善有善报,恶必有恶报。这果然是真的。就刚刚消息,日本的前任首相安倍晋三在发表演讲时,突然流老人言上有所好,下必甚焉大汉王朝的一代明君光武帝曾说治理好一个国家的关键在于上位者是否具有道德上的大智慧,是否懂得用仁爱去滋养黎民的心。而不是助长一种唯利是图的不良风气评价一个国家的标准,在于老百姓是否能行程卡取消星号后,再次将查询时间调整为7天,精准防控势在必行工信部彻底取消行程卡星号后,又再次将行程卡的查询时间范围由14天调整为7天,这说明在经历疫情带来的恐慌后,我们已经可以正确认识新冠,对于新冠的强传染性也能保持镇定。还记得,当初武汉
澳门冠军赛王楚钦夺冠是否实至名归?他要是碰上樊振东能赢吗?澳门冠军赛王楚钦夺得男单冠军是实至名归。他是在战胜向鹏马龙许昕和林高远等高手而夺冠的,他的冠军的含金量是蛮高的。我们衡量选手比赛要看整体表现,不能因为王楚钦没能遇到并战胜樊振东就认业余乒乓球选手怎样在最短的时间内提高球技并赢球?以下是我这个从业十余年的教练的心里话,看不下去嫌啰嗦的可以略过了!最短时间到底是多短呢,说句心里话,我刚开始比较抵触这个问题,我浏览了所有回答,也看了一些评论,我觉得说的都挺好的,刘诗雯04负于王曼昱无缘冠军,小枣澳门赛发挥可以打80分吗?澳门赛女单冠军的角逐,终于落下帷幕!刘诗雯以04无缘赛季首个女单冠军。那么,也有球迷说,刘诗雯在澳门赛的表现,可以打80分吗?我个人的回答是完全可以打80分了!3个月没有比赛,重返张本智和周启豪遭淘汰,林昀儒在下半区还有对手吗?能否冲冠?感谢邀请!张本智和周启豪相继出局之后,下半区男单的争夺基本上就是波尔与林昀儒的竞争了。波尔年已40岁,现阶段主要是靠经验和技巧来打球,硬实力上技术先进性上与林昀儒有差距。这两位的对世乒赛男单二号种子张本智和被淘汰,男单冠军是不是国乒最容易了?二号种子张本智和都被出局了,男单基本没有什么顾虑了,冠军勿庸置疑的。世乒赛张本智和被淘汰,是不是国乒男子单打冠军是最容易了。现在看高手走了一大半,韩国日本高手都走了。中国男子单打现在浙江出生的奥运冠军及其知名运动员你能知道哪几位?在浙江出生的奥运冠军及其知名运动员我只知道如下十四位陈招娣(19552013)出生于浙江省绍兴市,杭州人,前国家女子排球队运动员,八一队球员,曾荣立一等功。为中国女排1979年首获张怡宁在北京奥运会时,为什么被裁判要求临时换球拍?是国际乒联针对她吗?张怡宁是国乒史上唯一一位双满贯球员,但是在成就双满贯的路上并非一帆风顺。在2008年北京奥运会女单14决赛中,老张遇到了大麻烦,比赛马上就要开打的时候,她被告知球拍检测数据不合格球中国乒乓球公开赛对手真的只盯住一个伊藤美诚就万事大吉了吗?小看刘国梁,把伊藤神话了!胖子是个球痴,乒乓球天赋可谓亘古一人,他的高度不是谁都能预测或比肩的。他对乒乓球的理解无人匹敌,无论从运动员教练总教练乒协主席,基本无瑕疵。尤其这次回归后股市高手都是怎么补仓的,应该在哪个点位补仓?股市高手从不补仓!他们只在盈利的头寸上加仓!请你记住我这句话,因为这句话是我的师傅说的,他说我在市场上做了三十年的投资生涯,从来不是靠补仓盈利!补仓这个词一听到就不吉利!都只有在赚怀孕第一个月吃什么最好?首先恭喜你成为准妈妈(准爸爸),怀孕初期(前三个月)胎宝宝还不稳定,所以饮食各方面都要注意!第一个月,记得吃叶酸(前三个月都要吃)。多吃一些含有叶酸的蔬菜(比如茼蒿菜,菠菜),还有异位妊娠还可以再生育吗?异位妊娠还可以再生育吗?异位妊娠可以再生育,条件是至少有一侧输卵管是正常的。异位妊娠是指精卵结合以后,没有进入到子宫腔内,而是在宫腔以外的其他地方着床并继续发育。由于受精卵在子宫以