我是靠谱客的博主 风趣棒球,最近开发中收集的这篇文章主要介绍笔试里 单例模式的陷阱,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

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

 

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

 

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

 

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

最后

以上就是风趣棒球为你收集整理的笔试里 单例模式的陷阱的全部内容,希望文章能够帮你解决笔试里 单例模式的陷阱所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部