单例模式

原创 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;
	}
}



单例模式java代码

  • 2017年12月04日 19:46
  • 32KB
  • 下载

多种单例模式

  • 2017年11月30日 19:05
  • 3KB
  • 下载

Unity 单例模式总结

单例模式,简单说就是类的实例在内存中只存在一份单例模式有时又叫单态模式或者原子模式,不管名称怎么叫,表达的意思是一样的总结起来有二种:第一种: 写一个脚本,然后将这个脚本拖放到场景中某个对象身上,千...

单例模式

  • 2015年06月24日 10:08
  • 21KB
  • 下载

Android线程池+单例模式+webService

  • 2017年11月01日 10:36
  • 50.14MB
  • 下载

自定义toast你需要的都在这里,单例模式,自定义布局,完全自定义,可拖动的悬浮窗

1.单例的toast 参考:Android 特殊的单例Toast(防止重复显示) public class MyToast { /** 之前显示的内容 */ pri...

单例模式

  • 2013年11月14日 14:44
  • 24KB
  • 下载

单例模式详解

  • 2014年06月06日 00:14
  • 25KB
  • 下载

使用模板实现单例模式(线程安全)

很多我们经常用的方案其实不能完美适应多线程程序,主要原因是一些看似原子的操作其实并非原子操作,而是被分解成多个步骤,于是在多线程环境中就会出现问题。 #include #include //cl...

单例模式学习

  • 2013年01月06日 15:20
  • 3KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:单例模式
举报原因:
原因补充:

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