`
417441631
  • 浏览: 11994 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[面试题]非线程安全的单例模式?

阅读更多

 

最近面试的时候碰到一个题目:“写出一个非线程安全的单例模式。”

 

很头疼,这次在这里试着写一写,请各位高手看看是否正确?

 

单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。正是由于这个特 点,单例对象通常作为程序中的存放配置信息的载体,因为它能保证其他对象读到一致的信息。例如在某个服务器程序中,该服务器的配置信息可能存放在数据库或 文件中,这些配置数据由某个单例对象统一读取,服务进程中的其他对象如果要获取这些配置信息,只需访问该单例对象即可。这种方式极大地简化了在复杂环境 下,尤其是多线程环境下的配置管理,但是随着应用场景的不同,也可能带来一些同步问题。

 

普通的单例模式:

public class SingletonDemo {
	private static SingletonDemo singletonDemo=null;
	private SingletonDemo(){}
	public static SingletonDemo getSingletonDemo(){
		if(singletonDemo == null){
			singletonDemo = new SingletonDemo();      
		}
		return singletonDemo;
	}
}

  

这样的单例模式在单线程模式下应该不会出现什么问题,但是据说在多线程的时候,如果第一个线程发现了成员变量现在为空的时候,准备创建对象时,第二个线程也发现了成员变量为空,也会继续再创建一个对象,这样就会造成JVM中有多个单例类型的实例。而如果这个单例类型的成员变量在运行过程中变化,将会造成多个单例类型实例的不一致,产生一些很奇怪的现象。导致出错,解决方案:

 

 

线程安全的单例模式:

public class SingletonDemo {
	private static SingletonDemo singletonDemo=null;
	private SingletonDemo(){
	}
	private static synchronized void syncInit() {
		if (singletonDemo == null) {
			singletonDemo = new SingletonDemo();      
		}    
	}
	public static SingletonDemo getSingletonDemo(){
		if(singletonDemo == null){
			syncInit();
		}
		return singletonDemo;
	}
}

 

这种方式虽然引入了同步代码,但是因为这段同步代码只会在最开始的时候执行一次或多次,所以对整个系统的性能不会有影响。

 

 

以上学习参考与http://hi.baidu.com/ytstudio/blog/item/b03d85fc028ff981b901a0d3.html

 

 

 

分享到:
评论

相关推荐

    java面试题.pdf

    10道Java面试题及详细解答 1.Java中多态的实现方式是什么? 2. Java中如何避免空指针异常? 3. Java中垃圾回收的机制是什么? 4. Java中什么是反射? 5. Java中什么是线程安全?...10. Java中如何实现单例模式?

    NET面试题-多线程编程与线程同步1

    【标题】:“NET面试题-多线程编程与线程同步1” 【描述】:本篇文章主要探讨.NET框架下的多线程编程与线程同步相关的面试问题,包括线程与进程的区别、GUI线程访问控件限制、后台线程与前台线程、锁的使用以及线程...

    Java常见面试题(线程、集合、设计模式).zip

    Java作为一门广泛使用的编程语言,其面试题涵盖了多个核心领域,包括线程、集合和设计模式。这些主题在软件开发中至关重要,理解并熟练掌握它们是成为优秀Java开发者的关键。 线程是Java并发编程的基础,它允许多个...

    操作系统面 试题 单例模式

    操作系统面试题常常涵盖广泛的主题,包括但不限于进程管理、内存管理、线程同步、资源调度等。在这个场景中,我们关注的是“单例模式”以及与操作系统相关的“进程管理”。 单例模式是一种设计模式,用于确保一个类...

    java面试题_多线程(68题)

    23. **线程安全的初始化**:单例模式的双检锁(DCL)和静态内部类等实现方式。 24. **线程安全的日期时间类**:Java 8引入的`java.time`包中的类是线程安全的,替代了旧的`java.util.Date`和`Calendar`。 25. **...

    美团Java 岗 154 道面试题.zip

    请用 Java 写出线程安全的单例模式 100.在 Java 中,什么叫观察者设计模式(observer design pattern)? 101.使用工厂模式最主要的好处是什么?在哪里使用? 102.举一个用 Java 实现的装饰模式(decorator design ...

    Java面试题和工厂模式

    在面试中,关于工厂模式的问题可能包括:解释工厂模式的概念、比较不同类型的工厂模式、在实际项目中如何运用工厂模式、分析工厂模式的优缺点以及与其它设计模式(如建造者模式、单例模式)的区别等。候选人需要能够...

    设计模式面试题

    - 在多线程环境下,必须确保单例模式的线程安全性。 - 使用枚举(Enum)实现单例模式是一种简单且高效的方式,从Java 5开始支持。 - 需要注意懒汉式单例模式可能会带来的性能开销。 - 避免在单例类中使用过多的状态...

    java面试题,技术面试与设计模式

    - 单例模式:保证一个类只有一个实例,并提供全局访问点。 - 工厂方法:定义一个创建对象的接口,让子类决定实例化哪一个类。 - 抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类...

    JAVA工程师面试题和一些经典题

    在Java工程师的面试中,单例模式和多线程是两个非常重要的知识点,它们既是基础,也是进阶技能,往往能体现一个开发者的编程素养和技术深度。以下将详细阐述这两个主题。 **单例模式** 单例模式是一种设计模式,它...

    JAVA面试题大全(最新的)

    如何实现多线程的单例模式?接口和抽象类的区别在哪里? 三、集合框架 Java集合框架包括List、Set、Map等接口及其实现类,如ArrayList、LinkedList、HashSet、HashMap等。面试中常见的问题有:ArrayList和...

    10道Java面试必备的设计模式面试题

    在本文中,我们将对 10 道 Java 面试必备的设计模式面试题进行详细的解析,涵盖了单例模式、观察者模式、工厂模式、装饰器模式等多种设计模式。 1. JDK 中常用的设计模式 在 JDK 中,有多种常用的设计模式,例如...

    计算机和JAVA 面试题大全

    - 面试题:如何实现线程间的同步和通信? 10. **反射与注解** - 解释反射机制及其在运行时动态操作类和对象的能力。 - 面试题:如何通过反射创建并调用一个类的方法? - 讨论注解的用途,如代码自动生成、元...

    2021年JAVA开发面试题.zip

    2. **面向对象设计**:考察设计模式的理解,如单例模式、工厂模式、装饰器模式、代理模式等,以及SOLID原则的运用。 3. **并发编程**:涉及线程同步与通信(synchronized、wait/notify、Lock接口)、并发工具类(如...

    10道Java面试必备的设计模式面试题!.pdf

    本文将对 Java 设计模式面试题进行解析,涵盖了单例模式、观察者模式、工厂模式、装饰器模式等常见设计模式,并对每个模式的定义、应用场景和实现方式进行了详细的解释。 一、单例模式(Singleton pattern) 单例...

    2024年java面试题-设计模式面试题

    ### 2024年Java面试题之设计模式面试题详解 #### 一、设计模式概述 设计模式是在软件工程领域被广泛接受的一种编码实践,它代表了一套反复使用、广为人知的代码设计经验和解决方案的集合。设计模式旨在帮助开发者...

    .net面试题.net面试题.net面试题.net面试题(经典)

    12. **设计模式**:理解常见的设计模式,如工厂模式、单例模式、观察者模式、装饰器模式等,以及在.NET开发中的应用。 13. **内存管理**:深入探讨垃圾收集机制,理解内存泄漏的可能性以及如何避免。 14. **性能...

    2019最新整理Java面试题,常见面试题及答案汇总(史上最全最权威).rar

    熟悉常用的几种设计模式,如工厂模式、单例模式、观察者模式等;在数据库方面,SQL语句的优化,事务管理,以及JDBC操作等都会被考察;而JVM调优涉及类加载机制、内存分配策略、垃圾收集器的选择等。 最后,对于Java...

Global site tag (gtag.js) - Google Analytics