`
微Smile
  • 浏览: 34908 次
  • 性别: Icon_minigender_2
  • 来自: 湖南
社区版块
存档分类
最新评论

单例模式Singleton Pattern

 
阅读更多

单例模式:

单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这样的类就称为单例类。

 

单例模式的要点有三:

1) 某个类只能有一个实例。

2)它必须自行创建这个实例

3)它必须自行向整个系统提供这个实例。

 

应用场景:比如系统的日志记录,所有关联的日志都需要记录在一个文件中,此时就需用到单例模式。

 

单例模式的简单实现:

class Singleton {
	private static Singleton instance;
	
	//以保证向整个类提供这个实例
	public static Singleton getInstance() {
		if(instance == null) {
			return new Singleton();
		}
		return instance;
	}
}

 第二种实现:java在实现多线程的单例模式时,系统最好先初始化Singleton的实例。

class Singleton {
	private static Singleton instance = new Singleton();
	public static Singleton getInstance() {
		return instance;
	}
	
}

 

 

单例模式的优势和缺陷:

优点:为一个应用程序提供对象的唯一访问点,此种模式为设计及开发团队提供了共享的概念。

缺点:单例类对派生子类有很大的困难,只有在父类没有被实例化时才可以实现。

 

单例类应该注意的地方:

 

1)有些对象不能作为单例类对象,比如数据库连接对象。

2)如果实例化的对象长时间不被利用,系统会认为它是废物,自动消灭并回收它的资源,下次利用时又会重新实例化,这种情况下,应该注意其状态的丢失。

3)单例类在多线程时应该注意的问题:

 

我们来分析一下:

若在多线程中,1号线程确定了instance为null并调用getInstance方法来实例化一个新对象,但是在实例化完成之前,2号线程抢占了,也调用getInstance方法并发现instance为null,显然它又会new一个新对象。此时 我们就有两个对象了。违反了单例类得到一个实例的原则。

 

解决方法:

用synchronized加一层保护代码:

class Singleton {
	private static Singleton instance;
	
	//以保证向整个类提供这个实例
	public static Singleton getInstance() {
		if(instance == null) {
			synchronized(Singleton.class) {//1
				if(instance == null) {//2
					return new Singleton();//3
				}
			}
		}
		return instance;
	}
}

 此时我们再来分析:

当1号线程运行到//1时,获得同步锁,此时若1号线程被2号线程占用,由于instance仍未null,因此2号线程试图获得1号线程的同步锁,但此时由于1号线程仍持有该锁,2号线程被阻塞,则2号线程会被1号线程占据,1号线程再判断instance为null,因此运行到//3实例化一个新对象,并将其引用值赋给instance,1号线程退出synchronized块并返回一个instance实例,1号线程被2号线程抢占,2号线程运行//2判断instance不为null,因此不会再创建一个新对象。

 

然而,理论虽理想,但现实中确会遇到问题:并不能保证在单处理器或多处理器上能正确运行。

 

此处:详情请见:http://blog.csdn.net/kufeiyun/article/details/6166673

 

最后说一下单例模式的应用场景:

1 系统只需要一个实例对象。

2 客户调用类的单个实例只允许使用一个公共访问点。

分享到:
评论

相关推荐

    单例模式 Singleton Pattern

    ### 单例模式 Singleton Pattern #### 概述 单例模式是一种常见的设计模式,属于创建型模式之一。这种模式的核心在于确保某个类只有一个实例存在,并且提供一个全局访问点来获取该实例。单例模式在Java开发中尤其...

    通过go语言实现单例模式(Singleton Pattern).rar

    在Go语言中,实现单例模式(Singleton Pattern)通常涉及确保一个类只有一个实例,并提供一个全局访问点来获取该实例。由于Go语言没有传统的类和对象概念,但具有结构体(struct)和函数,我们可以通过使用包级变量...

    c++-设计模式之单例模式(Singleton Pattern)

    单例模式(Singleton Pattern)是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于需要全局共享资源的场景,比如配置管理、日志记录等。 单例模式的组成 私有构造函数:防止外部...

    Singleton pattern单例模式应用

    ### Singleton Pattern 单例模式应用详解 #### 一、单例模式概述 单例模式(Singleton Pattern)是一种常用的软件设计模式,在系统中确保某个类只有一个实例,并提供一个全局访问点。这种模式通常用于控制资源的...

    创建型模式之单例模式(Singleton Pattern)

    单例模式是软件设计模式中的一种,属于创建型模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,例如管理共享资源、配置对象或者缓存服务等。 单例模式的核心...

    设计模式 之 “单例模式[Singleton Pattern]”

    **单例模式(Singleton Pattern)**是软件设计模式中的一种基础模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如配置管理、线程池、数据库连接池等,这些都...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    3、单例模式SINGLETON PATTERN 4、多例模式MULTITION PATTERN 5、工厂方法模式FACTORY METHOD PATTERN 6、抽象工厂模式ABSTRACT FACTORY PATTERN 7、门面模式FACADE PATTERN 8、适配器模式ADAPTER PATTERN 9、模板...

    单例模式Singleton

    单例模式(Singleton Pattern)是一种常用的软件设计模式,它的核心思想是确保一个类在整个应用程序中只有一个实例存在,并提供一个全局访问点来获取这个实例。这种模式在很多场景下非常有用,比如管理系统资源、...

    C#单例模式(Singleton Pattern)详解

    C#单例模式(Singleton Pattern)是一种常用的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。下面我们将详细介绍C#单例模式的定义、实现和优化。 单例模式的定义: 单例模式的主要目的是确保一个...

    .Net 单例模式(Singleton)

     单例模式 Singleton Pattern 问题解决: (1)单例模式简介: Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点。这就提出了一个问题:如何绕过常规的构造器,提供一种机制来保证一个类只有...

    C#单例模式(Singleton Pattern)实例教程

    本文以实例形式讲述了C#单例模式(Singleton Pattern)的实现方法,分享给大家供大家参考。具体实现方法如下: 一般来说,当从应用程序全局的角度来看,如果只允许类的一个实例产生,就可以考虑单例模式。 1.即时加载...

    设计模式-Java单例模式的各种实现实例

    单例模式(Singleton Pattern)是一种常用的软件设计模式,它保证一个类仅有一个实例,并提供一个访问该实例的全局访问点。这种模式通常用于需要频繁地创建和销毁的对象,以减少系统性能开销。 单例模式的优点: ...

    第6讲_单例模式(Singleton)

    单例模式(Singleton Pattern)是一种常用的软件设计模式,它的核心意图是确保一个类在整个系统中只有一个实例,并提供一个全局访问点。这样的设计可以避免资源浪费,尤其在处理那些需要共享状态且频繁使用的对象时...

    单例模式应用场景

    其中,单例模式(Singleton Pattern)作为最简单的设计模式之一,旨在确保一个类只有一个实例,并提供一个全局访问点。尽管有些设计模式专家认为它过于简单而不能称为真正的“模式”,但单例模式因其简洁性和实用性...

    [创建型模式] 单例模式(Singleton Pattern)

    什么是单例模式 单例就是单个对象的意思,指在系统运行期间,一个类最多只能创建一个对象,且该类能自行创建这个对象的一种编码设计模式。 单例模式有两个特点: 在系统的整个生命周期内,单例对象最多只能有一个 ...

    通过javascript实现单例模式.rar

    在JavaScript中,单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。在JavaScript中实现单例模式通常涉及使用一个对象字面量或创建一个包含实例的...

    设计模式_单例模式.zip

    单例模式是软件设计中的一种常见模式,它的主要目的是确保一个类只有一个实例,并提供全局访问点。这样的设计在很多场景下都非常有用,比如配置管理、线程池、缓存服务等,因为这些服务通常只需要一个实例来协调整个...

    Java单例模式应用研究.pdf

    单例模式(Singleton Pattern)作为一种最基本的创建型设计模式,其主要目的是控制一个类的实例化过程,确保在整个应用程序中仅存在一个实例,并且该实例能够被全局访问。这种模式在实际软件开发中有着极其广泛的应用...

Global site tag (gtag.js) - Google Analytics