实现Singleton模式
题目:
设计一个类,我们只能生成该类的一个实例
饿汉模式-最简单最快的写法
public class SingletonH{
private SingletonH(){};
private static SingletonH singletonH = new SingletonH();
public static SingletonH getInstance() {
return singletonH;
}
}
懒汉模式
public class SingletonL{
private SingletonL(){};
private static SingletonL singletonL =null;
public static SingletonL getInstance() {
if(singletonL ==null) {
synchronized (SingletonH.class) {
if (singletonL == null) {
singletonL = new SingletonL();
}
}
}
return singletonL;
}
}
双重检查锁
public class Singleton {
private volatile static Singleton instance = null;
private Singleton(){}
public static Singleton getInstance(){
if(instance==null){
synchronized (Singleton.class){
if(instance==null){
instance = new Singleton();
}
}
}
return instance;
}
}
延伸:
1.为什么要使用volatile关键字?
多个线程同时访问时,volatile关键字可以把线程的工作内存已实例的对象即刻同步到主内存中,同时也能禁止指令重排.给对象分配内存,调用对象的构造方法,把引用指向分配的内存空间,这是正常逻辑的3个步骤,但是Java内存模型允许这个进行指令重排序,也就是这3步可能是123也可能是132,所以这里就有问题了,使用volatile结合两次instance==null判空,这样更严谨.
总结:
- 面试是表现自己的机会,不要当成考试,不要紧张,尽可能的表达自己的想法和思路.
- 学会引导面试官,聊自己擅长的领域,从面试官的话题延伸到自己擅长的方向.