实现单例模式

单例模式
1.什么是单例模式

通俗讲:在创建对象时,有且只有一个对象,给所有对象提供这一实例对象。

2.如何实现单例模式

首先将构造方法私有化,提供一个对外的静态方法,静态方法则包含单例类的对象。单例模式分为懒汉和饿汉。

 public class Single{
	private Single(){}
	private static Single single=new Single();
	public static Single getInstance(){
				return single;
			}
	}
//简单手撸

以上表示饿汉模式-此模式的线程是安全的,但它一直消耗了内存,因为在加载这个单例类时就已经创建了单列类的对象,此模式也符合我们实现单例模式的要求。

public class Single{
	private Single(){}
	private static Single single=null;
	public static Single getInstance(){
		if(sinle==null){//假设线程1执行到这时,
					//cpu的资源给了线程2,两个线程都进了if
				//所以这个单例对象就不是唯一的
			single=new Single();
			}
		return single;
		} 
	}

以上表示懒汉模式:当你需要使用的时候才创建,线程不安全。

如何改进懒汉模式线程的不安全?

1.加同步锁synchronized
直接在单例类提供的静态方法上加synchronized
2.优雅的方式(双重检查加锁)

public class Single{
	private Single(){}
	private static Single single=null;
	public static Single getInstance(){
		if(sinle==null){
			synchronized(Single.class){
				if(sinle==null){
					single=new Single();
				}
			}
		return single;
		} 
	}

此方法不仅保证了对象的唯一性而且还提升获取对象的效率,即创建对象时上锁,一旦对象创建完毕后,获取对象就不会触发上锁的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值