记得好像有本书叫做《java程序员必会的23中设计模式》,作为一个java程序员,我其实没有读过,呵呵。在这里就是借用一下23这个数字。但具体是不是只有23中呢?我想未必。是不是只有java程序员才需要学呢?也未必。关于设计模式的资料看过一些,但基本上是当时看明白了,过后就忘了,这是为什么呢?因为很少用到呗。没有用到印象就不会深刻。不过单例模式倒是常有用到,而且有遇到过线程并发问题,印象比较深刻。所以就总结一下。有什么不对的地方大家指出啊 :)
单例模式顾名思义,就是只有一个实例。当一个类的实例可以有且只可以一个的时候就需要用到了。为什么只需要有一个呢?有人说是为了节约内存。本人对这个说法持保留态度。只有一个实例确实减少内存占用,可是我认为这不是使用单例模式的理由。我认为使用单例模式的时机是当实例存在多个会引起程序逻辑错误的时候。比如类似有序的号码生成器这样的东西,怎么可以允许一个应用上存在多个呢?
单例模式到底怎么写呢?我想大多数的程序员都知道下面这种方式(我当时就这么写的,从网上学的哦):
public class Singleton {
private static Singleton instance = null;
private Singleton(){}
public static Singleton getInstance() {
f (instance==null)
instance=new Singleton();
return instance;
}
}
私有构造函数保证该类不能被别人直接New出来,只能通过静态的getInstance()方法得到实例。而且实例作为内部的一个静态对象存在,应该是在整个程序中唯一了。貌似一个单例模式就这么简单的别搞定了。我曾经就这么天真的认为,是这样。可是,剧情的设计通常是天真的小孩总会遇到妖精。
单线程的时候一切如设想的一样,没有任何问题。可是不管是web程序,还是EJB应用,都是多线程的,每个会话都有自己的线程。当两个线程几乎同时去getInstance()的时候,或许只差那么0.0000000001ms,程序走到if (instance==null) 这一行时,妖精出现了,两个线程同时断定(instance==null)为true,然后理所当然的都进行了 new Singleton()的操作并返回了实例。两个获取实例的线程所持有的Singleton实例将是不同的实例。此时,单例被破坏了,我们只能祈祷不要引起数据或者逻辑的混乱了。这种情况一旦发生,是无法跟踪调试,也是很难重现错误的。通常这种时候,用户就会打来电话,像唐僧看到妖精似的对你说:“有妖精,有妖精!”作为悟空你就会拿起金箍棒到处找妖精准备降妖,可是怎么也找不到。然后摸着脑袋说:“没有妖精啊?”实际上妖精是有的,而且总有一天会掳走唐僧。
那怎么办呢?任何妖精都有降伏的方法,而且方法可能很简单:
public final class Singleton {
private static final Singleton instance = new Singleton();
private Singleton(){}
public static synchronized Singleton getInstance() {
return instance;
}
}
直接new 一个实例赋给静态变量,任何时候在一个应用中这行代码只会执行一次,而getInstance() 只是返回了一下已经初始化好的对象而已。多线程同时调用getInstance()的时候也不回出现返回的对象不是同一个的情况了。当然,这只是解决单例模式多线程问题的一个简单的方法。方法是有很多的,这里就不多说了。
其实单例模式是很简单的,不过用的时候一定要考虑的多线程的时候并发的问题。处理好多线程并发才是单例模式的关键。
分享到:
相关推荐
单例模式是软件设计模式中的一种经典模式,它在Java编程中被广泛使用。这个模式的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于控制资源的共享,减少系统开销,以及在多线程环境中避免...
单例模式是软件设计模式中的一种经典模式,用于控制类的实例化过程,确保一个类在整个应用程序中只有一个实例存在。这种模式在很多场景下都非常有用,例如管理共享资源、配置对象或者缓存服务等。本资料主要介绍了...
单例模式是软件设计模式中的一种,属于创建型模式。单例模式的目的是确保一个类在任何时候都只有一个实例,并且提供一个全局访问点给外部程序使用。 ## 单例模式的定义 单例模式是一种常用的软件设计模式,通过单例...
单例模式是软件设计中的一种常见模式,它的主要目的是确保一个类只有一个实例,并提供全局访问点。这样的设计在很多场景下都非常有用,比如配置管理、线程池、缓存服务等,因为这些服务通常只需要一个实例来协调整个...
单例模式是软件设计模式中的一种经典模式,它在Java编程中被广泛使用。这个教程“【IT十八掌徐培成】Java基础第19天_05_单例模式”很可能深入讲解了如何在Java中实现单例,以及单例模式在实际应用中的重要性和原理。...
### Singleton Pattern 单例模式应用详解 #### 一、单例模式概述 单例模式(Singleton Pattern)是一种常用的软件设计模式,在系统中确保某个类只有一个实例,并提供一个全局访问点。这种模式通常用于控制资源的...
在Qt的Qml环境中,单例模式是一种设计模式,它允许在整个应用程序中创建一个全局访问点,确保某个类只有一个实例存在。这样的设计模式在需要共享数据或者服务时非常有用,避免了多处创建相同对象导致的数据不一致或...
单例模式(Singleton Pattern)是一种常用的软件设计模式,它的核心意图是确保一个类在整个系统中只有一个实例,并提供一个全局访问点。这样的设计可以避免资源浪费,尤其在处理那些需要共享状态且频繁使用的对象时...
单例模式是软件设计模式中的一种经典模式,它在许多场景下被广泛使用,尤其是在需要全局唯一实例的情况下。本文将深入探讨单例模式的概念、作用、实现方式以及其在实际编程中的应用。 单例模式的核心思想是确保一个...
在Java应用中,单例对象能保证在一个...3、有些像交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了,只有使用单例模式,才能保证核心交易服务器独立控制整个流程。 CSDN代码的详细解释。
在Android开发中,单例模式(Singleton)是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式在管理共享资源、控制并发以及减少对象创建的开销等方面非常有用。本篇文章将深入讲解...
C++实现Singleton单例模式 本文档将详细介绍如何使用C++语言实现设计模式中的单例模式。单例模式是一种常用的设计模式,它可以确保一个类只能实例化一次。 单例模式的定义: 单例模式是一种创建型模式,它可以确保...
3. **简化配置和初始化:** 对于需要进行复杂初始化或配置的类来说,单例模式可以避免每次都需要重复这些步骤。 4. **易于扩展:** 当需要对单例对象进行功能增强时,只需修改该类即可,无需考虑其他地方对该类的...
单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。在 Delphi 中,实现单例模式同样重要,因为它在控制资源、管理共享对象或者在整个应用程序生命周期内仅需实例化一次的对象时非常...
单例模式是软件设计模式中的一种,用于控制类的实例化过程,确保一个类在整个程序运行过程中只有一个实例存在。在C#中,单例模式的应用非常广泛,特别是在需要全局访问点或者资源管理的情况下,比如数据库连接、...
"singleton单例模式1" 单例设计模式是软件设计模式中的一种,目的是确保某个类只能有一个实例,并提供一个全局的访问点来访问这个实例。 首先,单例模式的要点是:① 某个类只能有一个实例。构造器私有化。② 它...
"QT_C++单例模式懒汉+饿汉.rar"是一个压缩包,包含了关于C++在QT环境下实现单例模式的实例,分为懒汉式和饿汉式两种实现方式。 首先,我们来看一下单例模式的基本原理。单例模式通常用于那些需要频繁实例化然后销毁...
Java中的Singleton(单例模式)是一种常用的软件设计模式,它保证了类只有一个实例,并提供一个全局访问点。这种模式在需要频繁创建和销毁对象的场景中特别有用,因为它可以节省系统资源,例如数据库连接或者线程池...
4. "C++、MFC源代码Singleton_demo":这是主要的源代码文件夹,包含实现单例模式的C++和MFC代码。在这个文件夹中,通常会找到头文件(.h)、源文件(.cpp)以及可能的项目配置文件(.vcxproj等)。 在C++中,单例...
单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。在C++中,实现单例模式有多种方法,我们将会深入探讨这一模式的原理、优缺点以及如何在实际编程中应用。 单例模式的核心在于...