笔试里 单例模式的陷阱

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

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

 

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

 

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

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值