设计模式相关知识在面试中经常被问到,其中的单例模式几乎是每次必问,同时还会要求手写单例模式的代码。至于为什么也不难理解,它的实现代码简短,用较短的时间就能完成,同时代码中也不乏一些细节可以考察面试者的基本功。简单啰嗦一下单例模式的基本知识,借用下网络搜索的结果:
概念上可理解成一个类只有一个实例,实现上是要注意以下三点:
写了这么多,感觉是不是有点孔乙已了。好吧,其实面试官只是想知道下面几点
- 单例模式的类只提供私有的构造函数,
- 类定义中含有一个该类的静态私有对象,
- 该类提供了一个静态公有函数用于创建或获取它的静态私有对象
- //懒汉式
- public class SingletonA {
- public static SingletonA instance = null;
- private SingletonA(){ }
- public static SingletonA getSingletonA(){
- if(instance == null){
- instance = new SingletonA();
- }
- return instance;
- }
- }
- //饿汉式
- public class SingletonB {
- private static SingletonB instanceB = new SingletonB();
- private SingletonB(){}
- public static synchronized SingletonB getInstance(){
- return instanceB;
- }
- }
- //双重锁定
- public class SingletonC {
- private static SingletonC instance = null;
- private SingletonC(){};
- public static SingletonC getInstance(){
- if(instance == null){
- synchronized (SingletonC.class) {
- if(null == instance){
- instance = new SingletonC();
- }
- }
- }
- return instance;
- }
- }
- 面试者是否了解单例,
- 是否知道懒汉式和饿汉式的区别
- 是不是还知道有双重锁定这么一回事,
- 是否会注意到饿汉式需要同步操作才好。
下面简述:所谓“懒汉式”与“饿汉式”的区别,是在与建立单例对象的时间的不同。
它有以下几个要素:
- 私有的构造方法
- 指向自己实例的私有静态引用
- 以自己实例为返回值的静态的公有的方法
比较:
饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变
懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的
推荐使用第一种