笔试里 单例模式的陷阱
遇到了一个有意思的事情:任选一种语言实现单例模式。
因为之前看过设计模式,这道题目感觉很简单,但是后来想了下,应该不可能考的这么简单啊,分析了下出题者的意图,可能不是考察代码本身,而是考察你的严谨性。
?
单例模式最先想到的就是懒汉式或者饿汉式,简单易写:
?
1.懒汉式:
/* * 懒汉式 */public class Singleton_simple {private Singleton_simple() {//1.构造函数私有化}private static Singleton_simple instance;// 未初始化/* * 懒汉式,用的时候,才判断是否该实例是否是非null */public static Singleton_simple getInstance() {if (instance == null) {instance = new Singleton_simple();}return instance;}}
?
?
2.饿汉式:
/* * 饿汉式 */public class Singleton_simple1 {private Singleton_simple1() {//1.构造函数私有化}private static final Singleton_simple1 instance = new Singleton_simple1();// 直接初始化public static Singleton_simple1 getInstance() {return instance;}}
?
?
?
但是,在上面两种代码自选一种写上去,我想肯定不会得到满分的,到底问题在哪里呢?以上代码只适合单线程,多线程会出错。所以,再写一个多线程的代码即可。可是,实现多线程下的单例模式的代码也有好多种写法,选择哪一种呢?当然是考虑下效率。多线程你要考虑锁,那么就在锁上优化下吧。
?
多线程下的单例:
?
/* * 多线程 */public class Singleton {private Singleton() { //1.构造函数私有化,无法使用new Singleton()方式}private static Singleton instance = null;//2.创建一个静态的类实例/* * getInstance()方法,返回一个Singleton类实例 * 使用双重检查,两次if判断,原因是考虑锁的效率问题。 */public static Singleton getInstance() { if (instance == null) { //第一次检查synchronized (Singleton.class) {if (instance == null) { //第二次检查instance = new Singleton();}}}return instance; //返回单例对象}}
?
写一种单线程的,再写一个多线程的代码。这道题目基本就是满分了。