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

关于Java单例设计模式,你想知道的都在这!渡一教育

  在程序员编写代码时候其实需要考虑到很多问题:
  1. 可用性(完整的达到业务目的) 2. 健壮性(程序在各种环境各种操作都能保证正常的运行)
  3. 复用性(代码能够被别的模块调用来达到不同的目的,这里一定程度上有解耦的思想)
  4. 可扩展性(代码设计足够灵活,能够适应尽可能多的业务)
  5. 性能
  6. 内存占用(在我理解里 性能与内存占用往往两难全,性能的提升,往往代表内存的更多占用。比如动态数组ArrayList为了避免频繁的扩容,会进行1.5倍扩容,让数据以较少的代价增加。)
  在根据以上的问题,对代码进行不断设计情况下,前辈们在一些常用通用的问题上面找到了其对应的最优解决方式(注意这是解决问题的方式而不是问题的答案,它更多表示一种思想,而我们的代码是这种 思想的载体)由此衍生出设计模式:设计模式之——单例模式。01  单例定义
  单例即为单个实例,在java中这表示一个类的对象有且只能有一个。
  为什么需要单例大家跟我想一想,现实生活中,我们不可能为了满足一个人购物的需求去建一个商场。 而一个商场它可以为许多人执行卖东西的功能,那个人只需要跟其他人一样进这一个商场使用卖东西的 功能就行了。
  所以发现没我们所有人达到同一个一个目的,很多时候我们需要的是它能做什么,而不是它本身。 我不会为了买东西去创建一个商场,我会跟其他人一样使用同一个商场的卖东西的功能。
  在java中也一样,我们使用一个对象的方法,需要:
  1、先创建这个对象 2、调用这个的对象方法
  3、舍弃对象
  一个人使用还好那么如果是千万的人呢?那是不是要创建千万次对象。但我们这千万的人达到目的真正 需要不是这个对象,而是需要这个对象的功能。
  总结:当一个功能性的类,被多个对象共享使用方法时候,为了避免浪费内存资源和频繁的创建对象。需要将这个类单例化。
  02  单例的设计过程
  构造方法私有化
  为了保证永远在内存中只有一个对象,那么不让其他类创建对象。我们需要设置创建的权限,只有类自己有权限创建对象。
  private SingleTon(){}
  内部创建对象
  这时候问题来了,只有类本身能创建对象时候,我们应该在哪里创建呢我们复习一下类结构:构造方法、 代码块、方法、属性。
  1. 构造方法: 构造方法已经私有化,你内部方法就算new了对象。但是抱歉外界并不能调用执行构造方法,这个new并不能执行 2. 代码块: 代码块是能够在类初始化时候执行,但是问题来了,有蛋生没篮子接,外界并不能拿到地址 找到这个代码块中创建的对象
  3. 方法: 这就是一个先有鸡还是先有蛋的问题了,外部创建对象也就用不到这个方法
  4. 属性: 这似乎是最后一根救命稻草了 好像属性里也能创建对象
  private SingleTon(){}public SingleTon singleTon=new SingleTon();
  创建和获取
  但是问题来了,你创建了对象,对象的属性创建了对象,对象的属性创建了对象的属性创建了对象.............系统会执行这样的一个套娃。
  堆内存中对象不断往里嵌套属性,栈内存中第一个对象开辟的构造方法栈还没执行完,就还得开辟一个 新的构造方法栈,这样堆内存中的方法栈不断堆积形成栈内存逸出错误。
  我们需要告诉计算机,这个对象只需要一个就行了,哪里可以让一个类只有一个对象存在静态区。
  我们需要为这个属性加一个static修饰符一是让他类初始化完成避免了套娃式的创建对象,二是静态的变量能够被外界得到。
  但是这时候又有个问题:
  SingleTon.singleTon=null
  如果有用户篡改了这唯一的对象,那就不可行了,我们需要做一个简单的封装,只留一个后门让你过来取。
  private SingleTon (){}private static SingleTon singleTon=new SingleTon();public static SingleTon getSingleTon(){   return singleTon; }
  但是也请别忘了,java世界中我们可以开挂:我们可以通过反射来获取私有属性进行篡改 所以我们需要加个final 修饰让变量本身变得完全不可改。
  方式一:
  private SingleTon (){}private static final SingleTon singleTon=new SingleTon();public static SingleTon getSingleTon(){   return singleTon; }
  这是单例的方法之一,这代码有一个问题。我业务执行的时候,可能不会用这个对象,但是这个对象就 是初始化之后在内存中凉着;而且如果一个系统有千万个单例呢,系统初始化的时候,所有单例对象跟着 初始化这种服务器的压力不敢想象。
  所以我们可以设置一个机制,等我们需要他的时候在创建他方式二。这时候大家跟我想一个问题,如果在多线程情况下会发生什么呢?
  方式二:
  private SingleTon(){}private static SingleTon  singleTon;public static  SingleTon getSingleTon(){   if (singleTon==null){         singleTon= new SingleTon();     } }
  假如有A B两个线程:正常情况 A判断无 A创建 A创建完成 B判断直接使用
  但是如果A创建的时候 B发现对象还没有创建也创建了呢
  这就是一个原子性没有达到多线程并发所导致的安全性问题
  所以为了防止多线程带来的问题我们应该给方法加个锁,加锁期间其他线程不能使用方法
  方式三:
  //防止高并发private SingleTon(){}private static SingleTon  singleTon;public static  synchronized SingleTon getSingleTon(){   if (singleTon==null){         SingleTon= new singleTon();     } }
  但是还有一个问题:这个这个方法内部会执行很多其他事情,而这些事情多线程环境并不会导致问题。
  这时候其他线程会没必要的常时间等待所以我们应该局部加锁(加锁中我们应该尽可能避免一个线程长时间持有锁)
  方式四:
  private SingleTon(){}private static SingleTon  singleTon;public static   SingleTon getSingleTon(){   if (singleTon==null){       synchronized(Singleton.class){           //我们判断之后立刻锁住这个类             //为了防止锁住之前已经有人先入创建了对象,再进行一次判断             if(singleTon == null){                 singleTon= new Singleton()             }         }     } }
  这时候其实还有最后一个问题:
  single=new Singleton(); 这行代码它执行了不止一步,分为三步
  1. 分配内存空间 2. 调用构造方法,加载对象
  3. 将地址赋值给变量
  这时候jvm本身有个特性为指令重排,就是这三个指令有可能会被打乱执行为了提高性能编译器和处理器常常会对既定代码执行顺序进行指令重排。
  这时候大家跟我想一想:如果1执行了3比2先执行。执行完3准备执行2之前,另一个线程判断这个变量 有地址引用哦!非空的我直接拿去用啦,使用时候发现这是一个空壳,会爆出空指针异常。
  所以我们需要让jvm不要执行指令重排 java 提供了volatile 关键字volatile 修饰变量有两个特性:1.禁止指令重排2.保证变量可见性第一个特性能够帮助我们解决指令重排问题:
  方式五:
  private SingleTon(){}private static volatile SingleTon  singleTon;public static   SingleTon getSingleTon(){   if (singleTon==null){       synchronized(Singleton.class){           if(singleTon == null){                 singleTon= new Singleton()             }         }     } }
  总结:
  方式一:在属性中创建对象,static修饰防止多次执行构造方法fianl和private修饰防止被修改,留一个static 的得到方法
  方式二:增加一个懒加载机制,等需要的时候,对象如果没有再创建
  方式三:为了防止高并发 给方法加锁
  方式四:局部加锁只给赋值过程时候加锁方式五volatile 修饰变量防止指令重排

心情说说曾经牵手的手指,夜里独自合十1你是我的一切,而别人只不过是从我生命边上轻轻擦过的路人。2今夜我不催你来,我不吻晚风,我只做梦,等你啄唇。3总要经历过一些背叛,一些心酸,才能在最后把人心看明白。4人流是叫人痛苦诗经国风周南葛覃致敬天下的母亲,你们是中国的半边天时空穿越,再现意境。敬请欣赏!在儿时的记忆里,不知道大家是否想起了一个这样的场景,白天母亲去农田干活,晚上回来在煤油灯下面织毛衣的场景,每每想到这里,就觉得母亲的不容易与勤劳善良。古人寻梦,今人逐梦。神州十二,圆梦纪元微风习习,适感的凉意。骄阳明媚,斑斓的阳光随意遍撒。我的露台摊得大片。周遭安宁闲适,好似刚刚发生的了不起的大事,如波澜不惊的深渊潭水,讳莫如深。艳阳似在笑我。抬头看天,淡蓝澄澈背景神州十二号,三名航天员安全顺利出舱状态良好据中国载人航天工程办公室音讯,北京工夫2021年9月17日13时34分,神舟十二号载人飞船返回舱在西风着陆场成功着陆,执行飞行义务的航天员聂海胜刘伯明汤洪波平安顺利出舱,身体形态良今年境界最高的一条朋友圈!(我读了整整五遍,太透彻了)命由我造福自我求关注积德虽无人见,行善自有天知。宽心KUANXIN人活着,没必要凡事都争个明白。水至清则无鱼,人至清则无朋。跟家人争,争赢了,亲情没了跟爱人争,争赢了,感情淡了跟朋关于起点的句子1在阳光下行走,放慢自己的脚步,洒一地阳光,在这微凉的季节,给我们记忆中那些曾经的美好,给心中那些念着想着的朋友,给身边那些温情的眼睛阳光下行走,是阳光的心态在牵引,生活中到处是艰自在观花戏流水自在观花戏流水文陈慧飞(网名金贵妃)阳光日日倾城,执一杯小青柑坐在阳台的吊篮里,看白云飘逸的天穹远处高架桥上川流的车影对面桃花灼灼,一片花影自在飘零,如一道美丽的红弧。原计划着回老红彤彤的柿子惊艳了小山村愿辛勤劳作的人们事事(柿柿)如意闪光时刻主题征文二期今天下午偶然的机会,在享受着冬日暖阳,来到这小山村,驻足看见长满柿子的一颗老树。心里倍感亲切,纯朴善良的村民们将那些成熟的柿子留下一些给鸟儿们享用,这反到给这座只想轻轻的告诉你今生认识你真的很好只想轻轻的告诉你今生认识你真的很好爱上了你就再也放不下你你就是我这一生缠绵于心的相思与眷恋即使远隔千山万水即便不能朝夕相伴我也会一直一直的爱着你想着你念着你直到岁月老去直到白发暮年唯有你优秀了,你才会遇到更好的人,早安姑娘,二十多岁是用来脱贫的,不是用来脱单的,该读书就好好读书为自己拼一个好将来,该工作就努力工作为自身创造价值,唯有你优秀了,你才会遇到更好的人,成长的路上,你只有勇敢接受生命给你8月3日早安心语日签每日心语再不完美的行动,也胜过犹豫被动的等待和停滞不前的踟蹰。五步十步都是进步,顿悟渐悟都是领悟。只要你开始出发,就已经赢了还停留在起点的人。早安!万年历星期二第32周2021年8
这事一本万利,要做并不容易随喜的修行可以帮助我们打破我执用开放的的心接纳他人随喜的修行看似简单,甚至可以不需要成本。比如他人做好事时,我们发自内心地认可欢喜赞叹,这么做并不需要付出具体财物,同样功德极大。但忙到根本停不下来红尘里所有的希望都来自有所得的心这恰恰是通达解脱的障碍世人做任何事都要有结果。如果明知没有结果,多半是没人去做的。对结果的需要,和我们的心有关,因为它是有所得的心,是无明的产物。因走着走着,就老了当我们想到死亡想到所造罪业对生命的影响就会对修行生起迫切之心白天黑夜的相续就像流水一样,时时迁流。正如孔老夫子所言逝者如斯夫,不舍昼夜。伴随时间的流逝,生命也在走向衰老和死亡。从我退步原来有两种,你知道吗?问在修行中遇到退步,很紧张,怎样调整自身心态?修行的退步有两种情况一是正常的退步,一是非正常的退步。修行过程,是降伏凡夫心的过程,而凡夫心是无始以来形成的。虽然我们每天按特定的法门80岁老人直言晚年搭伙绝不交退休金卡,生活费和零花钱可以商量看人间疾苦关注情感酵母我们的故事就开始了少是夫妻老来伴,人到老了才知道老伴的重要性,上了年纪的老人都想紧紧握住老伴的手走过最后一程,不想独自承受一个人的孤单和凄苦,可是对现实里的变你赚钱的方式,暴露了你的层次前几天看某位经济学家说过这样一句话2021年是过去十年里最差的一年,却是未来十年最好的十年。对此我深表认同,我在我头条号的多篇长文中不止一次地提到,20202021年度,一定是世界迪芃观点如何下好组织变革这局棋?(好文转发)企业组织变革是个系统性工程,而变革本身是一种持续不间断的调整变化过程。对一个发展中的企业,不存在一蹴而就的组织变革,也不要追求一劳永逸的变革成果。这是组织变革的内在规律和客观存在,你所有的问题,都源于你不够强大当你变好了,全世界都好了最近写的破局思维我们都被困在财富的囚牢里一文,有非常多的朋友在讨论,其中有不少的读者提到我们到底要不要追求财富,安贫乐道难道不好吗?可能比较喜欢看我长文的朋破局思维我们都被困在财富的囚牢里最近一直在思考一个问题,财富的本质到底是什么?为什么社会中绝大部分人都觉得钱不够花?年初的时候看到国家统计局发布了一个数据,中国有6亿人月收入不足1000元。但是在头条上面,经常看认知进阶逼迫自己像高手一样思考有一句非常流行的话叫贫穷限制了你的想像力,其实说的是我们的思维模式,思考问题的角度被外在环境所限制。大多数人都想成为更优秀更强的人,这是人类基因中自带的动力,但不是每一个人都能成为让你一生都难以翻身的五个认知陷阱生活中经常听到有人在说,明明自己比别人更努力,明明自己比别人更聪明,但就是赚不到更多的钱,过不上更好的生活,上天真是不公平。如果真的信了他们所说,那确实是社会不公,上天偏心,但沉下