今天下午去面试,二面面了有一个半小时,最后面试官说,你写个代码吧,你一定要注意各种语法啊,考虑效率啊,blabla...你写个单例模式吧。
然后我就开始写了。。。
然后写了下面的代码给面试官,然后说,多线程加锁的代码忘了具体是什么了。。。
class Singleton {
private:
static Singleton * volatile pInstance;
Singleton(){}
public:
Singleton* instance() {
if (pInstance == 0) {
Lock
{
if (pInstance == 0) {
pInstance = new Singleton;
}
}
}
return pInstance;
}
};
面试官看了半天说,嗯,就这样吧。。。
然后本来就要结束了,面试官突然又来了句,你的代码还有没有什么优化的?
我说,有!(因为我隐约记得看书的时候static对象可以写成在需要类实例的时候再创建。)
在哪?
在static那!
面试官看了一眼,然后,一脸惊喜,你的程序有个大bug!bug!bug!!!!这里少了一个static,然后blablabla....
不过,人家面试官分析的是对的。。。
面试官又补充了句,我给别人出这个题,都说不会,只有你写下来了,但是有个大bug!
你去找HR吧。
然后HR说,你可以回去了。。。
这就是一个单例模式引发的丢失一个offer的血案,具体点说,一个static丢失一个offer的血案!
丢失的static在这里:static Singleton* instance() {
class Singleton {
private:
static Singleton * volatile pInstance;
Singleton(){}
public:
static Singleton* instance() {
if (pInstance == 0) {
Lock
{
if (pInstance == 0) {
pInstance = new Singleton;
}
}
}
return pInstance;
}
};
其他的单例模式的代码一般都是用JAVA写的,这样:
public class Singleton {
private static Singleton single; //声明静态的单例对象的变量
private Singleton() {} //私有构造方法
public static Singleton getSingle() { //外部通过此方法可以获取对象
if (single == null) {
synchronized (Singleton.class) { //保证了同一时间只能只能有一个对象访问此同步块
if (single == null) {
single = new Singleton();
}
}
}
return single; //返回创建好的对象
}
}
这些代码都是双检锁 Double-checked locking pattern