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

单例模式(二)

  昨天介绍了最简单的单例模式,需要回看的可以从这里直接进入:
  单例模式(一)
  今天我们继续来深入探讨单例模式,还是以宇宙、地球和人的关系为例,
  昨天我们为了创建地球这样一个全局的、唯一的、共享的对象,我们的代码是这样设计的:
  public class Earth {      private static Earth earth = new Earth();      private Earth(){         System.out.println("构造函数");     }          public static Earth getInstance(){         return earth;     } }
  我们仔细分析代码,可以看到private  static  Earth earth = new  Earth()这行代码是声明了一个静态对象,这个静态对象是在类初始化的时候就会生成,当外部其他类来调用地球这个对象的时候,就不需要做任何初始化了,看起来是一件未雨绸缪的事情。
  这时候我们加一个新的需求:当有外部类调用地球这个对象的时候,地球再生成对象;这个需求我们可以这样假设,假如人类一开始是直接生存在宇宙中的,不寄生于任何星球,有一天人类意识到宇宙实在是太大,大家通信实在不方便、成本高,于是向宇宙这个系统发出一个需求指令:能不能创建一个新的星球,让人类移居到这个新的星球上,大家聚在一块,这样沟通成本低、通信方便。 这时候,我们就得给这个需求设定一个新的逻辑:假设地球一开始是不存在,当人类需要的时候,及时给创建出来,如何设计呢?
  还是在原有的代码上做改良,地球这个类唯一暴露给外部类访问的一个方法就是getInstance():
  public static Earth getInstance(){         return earth; }
  而之前的代码,我们知道,其实earth这个对象是早已经生成好的,这时候我们需要对这里的逻辑做改动:
  public class Earth {      // private static Earth earth = new Earth();      private static Earth earth;            private Earth(){         System.out.println("构造函数");      }            /** public static Earth getInstance(){         return earth;      }*/       public static Earth getInstance(){         return new Earth();      }       }
  通过注释掉的代码,我们可以发现,我们把对象创建的时机挪到了外部类调用的时候,这样就满足了调用时再生成地球对象的原则,但是问题来了,这样的话,如果有5个人来调用getInstance()方法,就会得到5个不同的对象,我们仍然可以用上一节介绍的测试方式:多线程模拟5个人类请求的方式来测试下:
  你会发现,测试的结果是打印出了5个不同的对象地址,这就一下子破坏了单例对象唯一性的原则,我们接着来推敲代码,有人可能会发现,每次我们都是return  new  Earth(); 如果在这句话上面加一个IF判断,是不是就能解决这个问题了呢:
  if (earth == null){    earth = new Earth(); } return earth;
  基本上能够想到这里,也就是走在正确的路上了,我们先判断下地球这个对象是否已经被初始化了,如果没有初始化(== null ) ,再去创建,如果已经初始化过了,就直接返回初始化过的对象,我们再来测试下:
  你会惊奇地发现5个人类去调用,其中有4个人类调用的结果是获取同一个对象,而其中1个人获取到一个不同的对象,如果再多运行几遍,你可能会发现这样的结果:
  这回是3个人调用的结果是获取同一个对象,而另外2个人分别获取了不同的对象,这是为什么?其实当你运行测试代码多次后,通过采样,会发现,有时候能够获得预期的结果,5个人获取同一个对象,而有时获得是不同的对象,接下来我们解决这个概率问题,让每一次获得的对象都是同一个对象,首先要找出问题到底出现在哪里? 归根结底的问题还是在这里:
  if(earth == null){        earth = new Earth();   }   return earth;
  我们模拟用户调用行为用的是多线程并发的测试方式,而上面这段代码是一段任何线程都可以公共访问的代码段,而多线程并发访问这段代码时的顺序有快慢,我们把这段代码分成3个语句块:
  语句1 : if(earth == null) 语句2 : earth = new Earth(); 语句3 : return earth;
  假设有A、B两个线程,因为线程的执行和速度和操作系统本身的调度有关,所以可能会有如下几种情况发生:
  当A还没访问语句1的时候,B已经去访问语句2了,所以这时候,A再去访问语句1,就发现对象已经初始化过了,那么这时候A、B会得到相同的对象当A访问语句1的时候,B已经访问语句2了,这时候A再去访问语句2,会生成一个新的对象,结果A、B会得到不同的对象
  所以这就导致了我们上面的测试结果,那么可能你会疑问,就不能让多个线程去顺序排队去调用这个公用方法吗?答案是可以的,的确,如果多个线程顺序排队去访问这段公用方法,就能让所有线程得到同一个对象,因为只要第一个线程访问过语句2后,其他线程再去访问语句1的时候,就会得到earth != null 的结果,然后就执行语句3,最终使所有线程得到的是同一个对象。
  那么如果现在要应对的是线程无法排队顺序访问的情况呢,或者说你都不知道调用方是如何调用的,但是我们必须确保的是不管调用方怎么调用,我们都能返回一个唯一的对象,我们继续来对代码推敲:
  public static Earth getInstance(){        synchronized (Earth.class){           if(earth == null){              earth = new Earth();           }        }        return earth;   }
  不难发现,我们在外层加了一层锁机制:sychronized, 这把锁就能保证不管有多少个线程,在锁里面的代码同一时刻只能被一个线程访问,再来看下测试结果:
  结果会发现,不管你运行多少次,每一次都能返回同一个对象,到这里就解决了多线程访问的唯一性问题,并且也解决了上面提出的需求:当需要地球这个对象的时候再去生成。
  今天主要介绍了单例模式的另外一种写法,下一篇会介绍单例模式的优化以及常用的几种单例模式写法上的区别。

辛巴推出了极致性价比河北衡水阜城开展资助优秀学子公益活动随着Z世代逐渐成为消费市场的主力军,大众的消费方式也发生了较大的改变,人们对国货的认知也在同步改变。尤其是直播电商的兴起,直播强大的流量效应让越来越多的国货被大众所看见。一些国货品退役两年后欲复出,J马过完歌手瘾又想回来踢球记者寒冰报道近日,哥伦比亚媒体透露,2020年12月曾宣布退役的36岁的前国脚前广州恒大外援杰克逊马丁内斯(下简称J马)希望复出。最近半年,他一直在进行体能训练,希望恢复状态,经纪央视春晚主持团疑似曝光4男2女以老带新,跟网友预测相差不大春节承载了几代人的回忆,是咱们中国新年的象征。所以,每个中国人民都会特别重视春节的到来,我们会提前准备好年货,打扫好屋子,贴好对联等等。所谓过年,绝对不仅仅是一顿丰盛的年夜饭或者一再评阿凡达2作者DanSchindel译者Issac校对易二三来源ReverseShot(2022年12月22日)在某些方面,阿凡达可能是自身成功的受害者。詹姆斯卡梅隆和他的团队为如何创造细致41岁迷倒赵丽颖,娶了比自己小10岁的中戏师妹,不磨皮满脸痘坑的他凭什么如此有魅力判断一个明星到底火不火,看他能不能上春晚就知道。近日有媒体发现,李光洁出现在2023年央视春晚第三次大联排的现场。他穿着黑色高领毛衫,外搭米灰色长款大衣,阔腿裤加白色球鞋,看起来帅天龙八部之乔峰传群星贺岁,甄功夫诠释武侠真谛金虎辞岁去,玉兔迎春来,2023年春节正在向我们快步走来。因疫情受到严重冲击的影视行业,势必迎来强势反弹。近日,古装武侠电影天龙八部之乔峰传(以下简称乔峰传)发布了英雄版预告片,之择君记和浮图缘各追8集一个追不下去,一个看上瘾2022年的上线的古偶爆款连连,从刘亦菲的梦华录到王鹤与虞书欣主演的苍兰诀都让国产古偶剧的品质直线上升,而到了2023年,观众对于对古偶剧的期待值更高,不少观众更是将爆款剧押在王鹤赵丽颖晒开年大片,穿金色露背裙秀婀娜身姿,风情万种越来越迷人1月13日,赵丽颖在个人社交平台分享了一组为某时尚杂志拍摄的封面大片,作为开年刊,颖宝的表现自然不在话下,每一帧都美得不可方物。她还开心发布了几个鲜花小表情,好心情藏都藏不住。颖宝你是我的荣耀且试天下,杨洋的这两部作品将在韩国播出今(13)日,杨洋迪丽热巴主演的电视剧你是我的荣耀韩国定档,将于1月25日在韩国播出。另一部由杨洋赵露思主演的电视剧且试天下去年已被韩国电视台买入播出版权,日前定档1月21日播出。对话金丝路奖评委颜丙燕讲述她的演艺之路与未完成的电影记忆视频加载中西影会客厅颜丙燕的演艺之路2012年,一个普通武汉女人的故事被搬上了银幕。万箭穿心,绝对是国产现实题材影片中的佼佼者。由颜丙燕饰演的李宝莉,复杂而真实,性格高傲好强的她对剧场版柯南电影每年一部的密码作者宋说第25部名侦探柯南剧场版电影名侦探柯南万圣节的新娘(以下简称万圣节的新娘)正在热映,此次柯南和警察安室透携手大破新案,又让殉职的人物再度登场,众人跨越时空破案,成为这部剧场
全球连线中国数字经济经验助力非洲创业青年视频加载中新华社吉布提市10月3日电只要打开手机,就能完成打车购物支付这样的生活或许我们已经习以为常。但对于一些前来中国求学的非洲年轻人来说,在收获专业知识之余,中国便利的数字生活夜深人静的时候,爱你的心总是会很想你原创孤月冷梅曾经的我和你就像风和雨忍不住总会相遇而后来即便我们那么相爱为何都做不了夫妻是我们之间没有爱的奇迹还是我们的爱情从没爱的气息为何想你一次痛百次你看不见我难过因为我永远不会如何做一个真正自由的人?陈果老师讲过真正自由的人不是热血上涌迷狂,真正自由的人不是为了摆脱理智纵容欲望的那种失控的状态,我们很多人把这个理解为自由,疯呀,狂呀,我们把这个事理解为自己,其实这根本就不是自由不是别人对你太苛刻,而是你让别人认为你太完美了总有人会有这种感觉,明明自己已经很努力地去做了,还时常被人质疑怎么连这么简单的事情都做不好,有的时候你可能会认为别人对自己太苛刻了,其实并非如此。上学的时候,班里有学霸,也有学渣。北溪管道被破坏,对我们国内钢市有何影响?北溪管道被破坏,还不知道谁干的,北约乌克兰美国俄罗斯中东,都有可能,都不好说,谁都有干的动力,咱先不管它。北溪管道那么,管道被破坏,第一影响就是,石油天然气会涨。第二影响,美国的降专访如龙工作室一口气公布三部新作的背后如龙的全球化进程。在前段时间结束的东京电玩展(TGS)期间,世嘉一次性公布了如龙系列的三部新作包括系列正传以春日一番和桐生一马两人为主角的如龙8如龙7外传英雄无名还有以坂本龙马为主走进县城看发展陕西武功县ampampquot买西北卖全国ampampquot形成模式经济日报原标题陕西武功县打造以农产品为重点的电商物流首位产业买西北卖全国形成模式陕西省咸阳市武功县位于关中平原腹地,置县史长达2300多年。有些可惜的是,武功县虽有个威武的名字,却2022。10。4国际黄金大家好,这里是本元资本。我们继续关注黄金市场,昨晚黄金不刹车,直接突破重要关口1688,既然给出这个关键信号,那么就跟着他去下一个位置。昨晚黄金已给明信号,既然突破关键压力位168200斤金属铑价值3。4亿元?谈谈贵金属的那些事一家上市公司发布通告,准备将100千克金属铑粉进行出售。这是什么情况?100千克,200斤金属粉?至于要发个通告吗?看看金属铑的价格,还真的很有必要。10月2日的最新市场报价,金属清醒女人必备语录1只有对你出钱出力出钱出力的人,才拥有对你的建议权,其余可以当没听见。2真爱你的人,不仅仅喜欢你开心时的模样,也不想错过你失落时的模样,哪怕你遇到一点小风雨,有一点小忧伤,他都会守人民日报金句摘抄无愧于誓言,不止于平凡1。风好正是扬帆时,奋楫逐浪向未来。2。无愧于誓言,不止于平凡。3。金秋送爽,稻谷飘香丰收中国,最美画卷。4。看似寻常最奇崛,成如容易却艰辛。5。夏收麦香阵阵,秋收稻浪滚滚。6。时