单例设计模式

单例设计模式

 

 

       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这条语句

了。

 

 

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值