程序员人生 网站导航

单件模式----我要吃巧克力

栏目:框架设计时间:2015-06-19 09:03:25

         欢迎来到这1站 单件模式(Singleton Pattern:用来创建唯一无2的,只能有1个实例的对象的入场券。

          单件模式――我要吃巧克力。几近所有面向对象的程序中,总有1些类的对象需要是唯1的,例如,通过数据库句柄到数据库的连接是独占的。您希望在利用程序中同享数据库句柄,由于在保持连接打开或关闭时,它是1种开消。再如大家最常常用的IM,如飞信、QQ,在同1台电脑,1个帐号只能有唯1的登录。穿越时空,我们来到了巧克力制造厂


          大家都知道,现代化的巧克力工厂具有计算机控制的巧克力锅炉,锅炉做的事,就是把巧克力和牛奶和其他原料融在1起,然后送到下1个阶段,1制成美味巧克力。这里有1个Cho-colate 公司的工业强度巧克力锅炉控制器。看看他的代码,你会发现代码写的相当谨慎,已用单件模式完善的制作出1炉可口美味的巧克力,当正打包运货的进程中,巧克力锅炉溢出了……原料溢出了

 

          我们来看框中的那1部份代码,假设现在有两个线程A和线程B,当线程A0.0时刻判断uniqueInstance是不是为空(0.0时刻判断巧克力锅是不是为空,是空,则想巧克力锅中加入制作原料),也就是线程A履行到this.singletonPattern=newSingletonPattern(),正在申请内存分配,可能在3.0时刻才能new出对象并返回(3.0时刻巧克力棒真正生成,并可以拿着吃了);在2.0时刻以内,线程B履行到if(this.singletonPattern==null),此时的这个判断条件是true还是false? true(线程B访问判断时,还是为空,因而再次加入巧克力原料),溢出来了!巧克力原料溢出来了! 在内存中就有两个new出的实例,这样不就存在问题了么。


          

          就这类情况,如何修改,怎样解决,因而引出第1种修改方案:只要把getInstance()变成同步(Synchronized)方法,多线程灾害几近就能够轻易地解决;

                  在多个进程访问的时候,必须等第1个进程结束才能顺次继续访问,大大地影响运行效力。为了符合大多数java利用程序,很明显地,我们需要确保单件模式能在多线程状态先正常工作。此时第1种修改方案已不满足需求,我们是不是应当想到第2种方案呢?

        

          如果利用程序总是创建并使用单件实例,或在创建和运行时方面的负担不太沉重,我们可能想急切创建此单件,利用这个做法,保证在任县线程访问uniqueInstance静态变量之前,1定先创建此实例。

         Static 静态声明变量,new出的对象1直占存内存,影响内存性能。

         利用两重检查加锁,首先检查是不是实例已创建了,如果实例未创建,“才”进行同步,这样1来,只有第1次会同步,这才是我正真想要的。


 

再度回到巧克力工厂……

         此刻,巧克力工厂的问题已解决了,而且Cho-colate 公司很高兴在锅炉的代码中能够采取这些专业知识。不管你使用哪种对线程解决方案,锅炉都能顺畅工作,不会有闪失。



------分隔线----------------------------
------分隔线----------------------------

最新技术推荐