单例模式

原创 2012年03月28日 20:11:20

   单例模式确保类只有一个实例,并提供一个全局访问点。单例模式平时使用的机会不多,通常用于数据库连接或线程池。

   单例模式:一个私有的构造器、一个静态变量、一个静态方法

全局变量和单例模式比较

       在java中,全局变量基本上是对对象的静态引用,可以提供全局访问。但有两个缺点:①不能确保只有一个实例,他会用许多全局变量指向许多小对象来污染命名空间;②急切实例化,在程序开始就创建好对象

       单例模式:① 确保类只有一个实例 ;②单件可以延迟实例化。利用单件模式可以在需要是创建对象。③没有公开的构造器,他的构造器通常声明为私有的。④单例类保持了一个对唯一的单例实例的静态引用,并且会从静态getInstance()方法中返回对那个实例的引用。

经典的单例模式实现

public class Singleton
{
	private static Singleton uniqueInstance;
	private Singleton(){}
	public static Singleton getInstance(){
		if(uniqueInstance==null){
			uniqueInstance=new Singleton();
		}
		return uniqueInstance;
	}
}

处理多线程

每个类加载器都定义了一个命名空间,如果不同类加载器加载同一个类(单例),可以回出现多个单例共存的情况。(当然也可以自行指定类加载器,并指定同一个类加载器)。

  在上述代码中,如果一个线程在第二行的赋值语句发生之前切换,那么成员变量instance仍然是null,然后另一个线程可能接下来进入到if块中。在这种情况下,两个不同的单例类实例就被创建。

只有把getInstance()变成同步(synchronized)方法,多线程灾难几乎就可以轻易解决了。

public class Singleton
{
	private static Singleton uniqueInstance;
	private Singleton(){}
	public static synchronized Singleton getInstance(){
		if(uniqueInstance==null){
			uniqueInstance=new Singleton();
		}
		return uniqueInstance;
	}
}

但是,如果只有第一次执行此方法时才需要同步,之后每次调用同步这个方法就显得比较累赘。

解决方法:

一。如果getInstance()的性能对于应用程序不是很关键,就什么也别做。

二。使用“急切”创建实例,而不使用延迟实例化的做法。

public class Singleton
{
	private static Singleton uniqueInstance=new Singleton();
	private Singleton(){}
	public static synchronized Singleton getInstance(){
		return uniqueInstance;
	}
}
三。用“双重检测加锁”,在getInstance()中减少使用同步。首先检测是否实例已经创建,如果尚未创建,才进行同步,这样就只有第一次会同步。这可以大大减少getInstance()的时间耗费,性能得到提高。。

public class Singleton
{
	private volatile static Singleton uniqueInstance;
	private Singleton(){}
	public static Singleton getInstance(){
		synchronized(Singleton class){
		if(uniqueInstance==null){
			uniqueInstance=new Singleton();
		}}
		return uniqueInstance;
	}
}



一个单例模式的简单例子

ex1: public class Singleton    {        private static final Singleton singleton = null;           p...
  • silence1214
  • silence1214
  • 2009年03月29日 14:56
  • 23501

Selenium使用单例模式

在项目中使用Selenium进行自动化,非常自然想到用单例对WebDriver进行管理,出于如下考虑:         1)提高成功率。多个实例会使得出现多个浏览器窗口,界面识别会出现问题,影响成功...
  • wanglian2017
  • wanglian2017
  • 2017年06月13日 21:58
  • 359

单例模式 -通俗易懂的讲解

什么是单例模式: 保证一个类有且仅有一个实例,并提供它的全局访问点。 单例模式有什么用: 其实单例的作用在于避免产生太多实例,也就是不用new那么多次,new一次就占用一次内存的资源,new多了...
  • yangxujia
  • yangxujia
  • 2013年04月10日 01:41
  • 916

设计模式学习笔记---单例模式(Java版)

GOF23(Group of  four) 创建型模式 单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式。 结构型模式 适配器模式,桥接模式,装饰模式,组合模式,外观模式,享元模式,代理模式...
  • scgaliguodong123_
  • scgaliguodong123_
  • 2015年01月09日 09:30
  • 1162

单例模式的三种常用的形式

自己做下笔记: //单例模式:他的应用场景—如果多个程序要操作一个对象中的数据,那么就要保证只有一个对象。 //饿汉式 publicclassSingle {     privatesta...
  • jiyidehao
  • jiyidehao
  • 2016年02月28日 12:26
  • 486

单例模式中静态变量初始化与不初始化有什么区别

public class Singleton { private static Singleton obj = new Singleton(); public static int count...
  • woshixiongjin
  • woshixiongjin
  • 2014年05月23日 17:16
  • 618

java单例模式原理

Singleton 是一种创建性模型,它用来确保只产生一个实例,并提供一个访问它的全局访问点.对一些类来说,保证只有一个实例是很重要的,比如有的时候,数据库连接或 Socket 连接要受到一定的限制,...
  • xiaoxiaocoder
  • xiaoxiaocoder
  • 2012年10月17日 14:08
  • 2716

C#单例模式的几种实现方式

C#单例模式的几种实现方式
  • yanlovehan
  • yanlovehan
  • 2016年11月09日 10:07
  • 2129

单例模式的自动析构

总所周知,单例模式如果不主动调用,在进程结束时是不会析构的,而是仅仅把内存释放掉而已 所以,如果希望在析构时进行某些操作,在进程结束前,可以主动调用析构函数,如下面类中的delMe函数(xSingl...
  • mengmingqiang
  • mengmingqiang
  • 2011年08月31日 15:43
  • 2739

【NCRE】---登录窗体应用“单例模式”

昨天,经过了一天的奋战,我们小组做的《计算机一级考试系统》终于上线了,虽然还是有很多的不足和自身处理问题上与别人的差距,可是自己前天晚上熬夜和这一个月以来总是不停的往学校跑也算是有所回报!剩下的就是静...
  • u013045959
  • u013045959
  • 2016年01月10日 09:19
  • 878
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:单例模式
举报原因:
原因补充:

(最多只允许输入30个字)