首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

笔试里 单例模式的圈套

2012-12-20 
笔试里 单例模式的陷阱遇到了一个有意思的事情:任选一种语言实现单例模式。因为之前看过设计模式,这道题目

笔试里 单例模式的陷阱

遇到了一个有意思的事情:任选一种语言实现单例模式。

因为之前看过设计模式,这道题目感觉很简单,但是后来想了下,应该不可能考的这么简单啊,分析了下出题者的意图,可能不是考察代码本身,而是考察你的严谨性。

?

单例模式最先想到的就是懒汉式或者饿汉式,简单易写:

?

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;  //返回单例对象}}

?

写一种单线程的,再写一个多线程的代码。这道题目基本就是满分了。

热点排行