`
功夫小当家
  • 浏览: 186473 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

笔试里 单例模式的陷阱

 
阅读更多

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

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

 

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

 

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

 

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

分享到:
评论

相关推荐

    设计模式笔试题

    在《设计模式笔试题》中,我们可以预见到可能会涉及到一些常见的设计模式,如单例模式、工厂模式、观察者模式、装饰器模式、策略模式等。下面将对这些模式进行详细的阐述。 1. **单例模式**:确保一个类只有一个...

    thoughtworks笔试作业

    在这个作业中,特别提到了两个重要的设计模式:单例模式和工厂模式。 1. **单例模式**: 单例模式确保一个类只有一个实例,并提供全局访问点。这种模式常用于管理共享资源,如数据库连接、线程池或配置对象。在C++...

    设计模式和框架笔试题

    设计模式和框架笔试题 在软件开发中,设计模式和框架扮演着非常重要的角色。设计模式是一种通用的解决问题的方法,它可以被应用于不同的场景中,而框架则是一种半成品,可以帮助开发者快速地开发出软件系统。在这里...

    中兴公司笔试题目集合

    在C++、Java或Python等语言中,实现单例模式有不同的方式,但核心思想是控制类的实例化过程,防止多实例化导致的问题。单例模式常用于资源管理、日志记录等场景,确保在整个程序中只有一个共享的对象。 第三部分则...

    2013百度校园招聘移动软件工程师笔试题

    - **单例模式**:单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。通过Java和C++两种语言实现单例模式可以考察应试者对不同语言特性的理解和应用能力。 #### 3. 栈(Stack)的...

    设计模式面试专题及答案.pdf

    单例模式(Singleton pattern)是创建型模式的一种,它确保一个类只有一个实例,并提供一个全局访问点。在Java中,单例模式可以通过私有构造器、一个私有静态变量以及一个公有静态方法来实现。由于单例模式在系统中...

    [笔试]中兴笔试+面试题目

    一个完整的单例模式需要考虑线程安全,防止多线程环境下产生多个实例,同时还需要提供获取单例对象的公共静态方法。 3. UML(统一建模语言): - UML图用于表示软件系统的结构和行为。在这个场景中,需要绘制用例...

    北大青鸟y2笔试题-20090816Y2 笔试

    8. **软件设计模式**:如单例模式、工厂模式、观察者模式等常见设计模式的理解和应用。 9. **项目管理**:敏捷开发、Scrum框架、版本控制工具(如Git)的使用等。 10. **编程实践**:可能包含一些实际编程题目,...

    海康威视模式识别笔试题

    海康威视作为全球领先的安防产品及解决方案提供商,在招聘过程中,尤其在技术岗位,常常会设置涉及模式识别的笔试题目。模式识别是计算机科学和人工智能领域的重要分支,它涉及到图像处理、机器学习、深度学习等多个...

    NHN笔试题收集

    此外,理解和熟练运用设计模式,如工厂模式、单例模式、观察者模式等,也是考察的关键点。 数据库部分,NHN的笔试题可能涵盖SQL查询、数据库设计、事务处理、索引优化和并发控制等内容。你需要熟悉SQL的基本操作,...

    IT行业笔试汇总(C,设计模式)

    例如,在单例模式中,确保一个类只有一个实例,并提供一个全局访问点,这对于控制资源访问和管理非常有用。 ### 总结 本文档通过解析Google实验室能力倾向测试中的部分题目,以及对设计模式的简要介绍,为准备参加...

    用友笔试题

    设计模式是软件开发中的重要思想,试题可能包含单例模式、工厂模式、观察者模式、装饰器模式、代理模式等经典设计模式的实现和应用场景。 最后,对于JVM的理解也是Java程序员必备的知识,可能涉及类加载机制、内存...

    java面试笔试试题大集合及答案(另附各大公司笔试题)

    设计模式是软件工程的精髓,常见的设计模式有工厂模式、单例模式、建造者模式、观察者模式、适配器模式、装饰器模式、桥接模式、代理模式、策略模式、模板方法模式、访问者模式等。理解并能灵活运用这些模式可以提高...

    java笔试题汇总及答案(另附各大公司笔试题)

    8. **设计模式**:常见的设计模式如工厂模式、单例模式、观察者模式、装饰者模式等在实际开发中应用广泛,理解其原理和应用场景能提高代码质量和可维护性。 9. **JVM相关**:了解JVM内存模型、垃圾回收机制、类加载...

    华为笔试题(面试,笔试)

    - 常见设计模式:工厂模式、单例模式、观察者模式、装饰器模式等。 5. **编程语言**: - C/C++:指针操作、内存管理、预处理器、异常处理。 - Java:类与对象、继承、多态、集合框架、异常处理、并发编程。 - ...

    深圳东软的笔试题

    #### 单例模式实现 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式在需要频繁实例化然后销毁的对象、创建的对象消耗资源较多且数量过多会严重影响性能时非常有用。 ...

    JAVA笔试题大集合及答案

    再者,设计模式是解决常见编程问题的模板,Java笔试中常考的有单例模式、工厂模式、装饰器模式、代理模式、观察者模式、适配器模式等。理解并能灵活运用这些模式是衡量开发者专业水平的重要标准。 此外,数据结构和...

    C++笔试.zip_C++_C++笔试题

    15. **设计模式**:虽然不是语言特性,但在面试和笔试中常常出现,如工厂模式、单例模式、观察者模式等。 通过深入学习这些知识点,并结合实际编程练习,将有助于你更好地理解和掌握C++语言,从而在笔试中取得优异...

    iOS常见笔试题.pdf

    iOS开发中常用的设计模式包括单例模式、工厂模式、代理模式、适配器模式以及装饰者模式等。单例模式确保某类只有一个实例,提供全局访问点。工厂模式则负责定义创建对象的接口,而具体的对象创建由子类负责。代理...

Global site tag (gtag.js) - Google Analytics