概述
遇到了一个有意思的事情:任选一种语言实现单例模式。
因为之前看过设计模式,这道题目感觉很简单,但是后来想了下,应该不可能考的这么简单啊,分析了下出题者的意图,可能不是考察代码本身,而是考察你的严谨性。
单例模式最先想到的就是懒汉式或者饿汉式,简单易写:
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; //返回单例对象
}
}
写一种单线程的,再写一个多线程的代码。这道题目基本就是满分了。
最后
以上就是风趣棒球为你收集整理的笔试里 单例模式的陷阱的全部内容,希望文章能够帮你解决笔试里 单例模式的陷阱所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复