Java 单例模式

设计模式是一种思想,适合于任何一门面向对象的语言。
单例模式:保证某个类的对象唯一
设计单例模式思路:
1、其他程序不能声明该类的对象。
2、该类声明了一个本类的实例。
3、对外提供方法让外界获取该对象。

步骤:
1、私有化该类的构造函数。
2、创建一个该类的实例。
3、创建一个方法返回该实例。
具体实现有两种:

饿汉式

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

优点:直接声明了一个私有静态实例,static属性只会初始化一次,保证了唯一性。
缺点:不管是否需要调用getInstance(),该类都会初始化一个实例,当不需要该实例时浪费了内存。

懒汉式

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

优点:没有直接声明静态实例,这样就不会造成内存的浪费,同时还能保证唯一性。
缺点:多线程的情况下,懒汉式由于多加了一次判断,没有办法保证对象的唯一性。在实际应用中也是饿汉式用的更多。

懒汉模式如何保证线程安全?

保证线程安全,在Java中用的最多的就是synchronized,进行加锁。

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

上面的代码直接在方法上加锁,效率十分低下,考虑更好的加锁办法。

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

该方法称为双重判空,第一次判空的时候,可能有多个线程的single都为null会进入if语句中,然后将if语句的内容进行加锁,只会有一个线程获得该锁,然后第一个进入的线程,通过第二次判空,创建新的实例,之后获得锁的线程直接返回实例。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值