单例模式

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

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

全局变量和单例模式比较

       在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;
	}
}



阅读更多
想对作者说点什么? 我来说一句

单例模式单例模式单例模式

2011年07月31日 467KB 下载

研磨单例模式研磨单例模式

2010年12月15日 123KB 下载

单例模式(讲解单例模式)

2011年01月18日 317KB 下载

Java单例模式(DOC)

2009年10月21日 91KB 下载

php单例模式和工厂模式

2009年05月22日 54KB 下载

设计模式之单例模式

2017年12月01日 9KB 下载

JAVA单例模式

2013年11月14日 46KB 下载

线程安全的单例模式

2012年12月07日 345KB 下载

单例模式详解~~单例模式详解~~

2011年03月01日 39KB 下载

研磨设计模式之单例模式.pdf

2011年11月16日 311KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭