码迷,mamicode.com
首页 > 其他好文 > 详细

单例设计模式

时间:2015-08-06 16:47:41      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:单例设计模式

单例设计模式

 

 

       Java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”

 

      从定义上来看,显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

      所以从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的公有

的函数用于创建或获取它本身的静态私有对象。

      话不多说,单例模式主要有两种,一种是懒汉式,一种是恶汉式,恶汉式相对简单一点,代码如下:

class Single{
	private static Single1 single=new Single1();
	
	private Single1(){};
	public static Single1 getSingle1Instance(){
		return single;
	}
} 

      懒汉式解读:要保证只有一个实例,首先需要构造函数私有化,防止外部直接创建对象,其次我们要写一个方法暴露一个对象出去,由于外部不能创建对象,所以我们写的这个方法需要时静态的,这样外部系统可以使用类名直接调用,当我们把这个方法定义成静态的之后,我们也需要把第一行代码的变量也要定义成静态的,因为静态函数只能访问静态成员!

       懒汉式有个缺点,就是不管你有没有用到这个对象,它都在堆中开辟了内存,造成了不必要的浪费!所以有了恶汉式

 

恶汉式代码如下:

class Single2{
	private static Single2 single=null;
	private Single2(){};
	
	public static Single2 getSingle1Instance(){
		if(single==null){
			synchronized(Single2.class){
				if(single==null){				
					single= new Single2();
				}
			}
		}
		return single;
	}
} 

恶汉式解读:因为恶汉式存在线程安全问题,为了保证只有一个实例,所以采用了双重判断的方式。

     如果用同步函数的话比较浪费时间,因为每次都要判断锁,所以我们一般不会先去判断锁,如果这对象还没有创建 那么就先创建,然后返回,当第二个线程来的时

候,先看看对象有没有创建,如果有创建,那么会直接返回这个对象如果没有创建,这个时候在判断有没有获取锁,进行锁的判断,如果可以进入锁,那么就创建对象返

回,如果不能进入锁说明此时有其他的线程正在创建对象,还没有把锁释放掉,所以要等待一会,当其他的线程创建了对象,释放了锁之后

这个线程才有可能拿到锁,进入之后一看,对象不为空了,那么只有执行最后的return  single这条语句了。

 

 

最后总结:考虑方便,在大部分的时候采用懒汉式!

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

单例设计模式

标签:单例设计模式

原文地址:http://blog.csdn.net/u013263323/article/details/47318209

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!