一.
上面截图中体现了单例设计模式的基本表现形式,就是通过三步来实现的。(饿汉式)
单例还有另外的表现形式。
刚开始在成员变量上,并没有进行对象的建立,只是先创建好了引用。在调用方法的时候,在调用方法当中,做了一个动作。感觉这个if语句有点多余?
这两种方式都能完成单例设计模式的解决方案,两者的区别在哪?
(截图中,第一句中是定义Single2类类型成员变量,用了private修饰。接着,下面的getInstance()方法中的if判断语句里,也有一个s,这里的s没有做任何的定义,可能就是上面所说的s?这里难道是private的功能,只供本类访问?)
single这个类在加载进内存的时候,已经建好内存了,因为s是静态的,它会随着类的加载而加载(非静态的呢?会随着类的加载而加载么?),加载完了后,就要进行初始化。这就是我们说的,类一加载对象就已经存在。
但是另一种语句,类加载进来,s的值是null空。什么时候有对象?只有调用getInstance()方法的时候,对象才会在堆内存中生成。
这种方式称为单例设计模式的延迟加载形式。(懒汉式)
二.
真正开发的时候,我们应该采取什么方式?采用饿汉式比较多。原因在于,无论是先加载还是后加载,最终我们的目的还是为了获取这个唯一的对象,不可能不获取对象,所以直接开始就创建对象就行了。
懒汉式存在一些问题:如果后期它被另外一种技术所操作时,(这种技术叫多线程技术),如果它要被多线程并发访问的时候,有可能保证不了对象的唯一性。它存在着安全的隐患,这时候就需要改变代码,直到安全为止,这时效率就降低了。
面试的时候,几乎面试的都是懒汉式。里面涉及的知识点非常的多,开发时走的饿汉式比较多,