单例模式的简单实现与两种实现方法的比较(饿汉式和懒汉式)(一)
饿汉式与懒汉式是单例模式的两种不同的写法,究竟使用哪个更为方便和安全呢?
首先我们已经知道饿汉式是在外部类访问该对象前,该对象就已经存在了,而懒汉式是等到有外部类访问时才创建对象的。
我们可能会以为使用懒汉式较为方便且安全,因为外部类访问时才创建对象,不访问就不创建对象。可是问题也来了:
先看一下懒汉式的实现方法:
我们都知道cpu在处理多个程序时,在非常短的时间内来回切换着执行各个程序的,所以当一个外部类A访问getInstance()方法时有可能会被cpu暂时终止执行,而改去执行其他的程序,如果cpu 在程序A访问到第39行“if(single == null)"时终止执行,而改去执行B程序,而刚好B程序也在访问getInstance()方法,那么程序B在访问时必定创建一个Single对象,而此时cpu再改去执行A程序,A程序也会创建一个Single对象,这时就会出现了错误。
有错误就得解决啊,那该如何解决呢?
这里使用java多线程中的关键字synchronized,因为当使用它来修饰一个方法或者一个代码块的时候,能够保证在同一时刻只有一个线程访问该程序。
代码如下:
这样当多程序执行时,也就不存在安全的问题了,只是这时,如果这样使用该懒汉式就会使代码变得繁琐起来,而饿汉式是既方便又安全的单例模式实现方法。所以原则上是建议使用饿汉式单例模式。