单例模式

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">例模式又做单件模式: 用来创建独一无二的,只能有一个实例的对象的入场券</span>

单例模式有什么用途?

有些对象其实我们只需要一个,比方说:缓存,线程池,日志对象等,事实上这些对象只能有一个实例,如果有多个实例,就会导致许多问题的产生。下面就来说一下如何一个唯一的对象。

1.首先如何创建一个对象 

new MyObject();

如果MyObject 的构造方法是公开的,我们需要的时候就new一个。

如果我们把MyObject的构造方法定义为私有的,会发生什么情况

public class MyObject {
	private MyObject(){
		
	}
}
这样的话外部就能通过new 方法来获取MyObject 的实例。

所以现在需要对外提供一个静态的获取实例的方法,MyObject.getIntsance


这样的话,通过getInstance就可以得到一个实例。

但是现在我们回过头来看看我们设计的这个单例类,是否能真正的得到唯一的一个实例?

如果在多线程的情况,是不能保证安全的,当线程A第一次通过getInstance获取,现在uniqueInstance是空的,执行了new 方法,恰好线程B过来也执行getInstance这样的话 new Singleton()就行执行了两次。

为了解决这个问题,我们只需通过增加synchronized修饰getInstance方法,这样就可以避免多线程的安全问题了。


但是问题又来了,同步会降低性能,而且一个uniqueInstance 被初始化后,就不需要同步这个方法,之后每次同步这个方法都是累赘的。


我们还是有选择的,方法总比困难多。。。。方法如何

1.如果我们对性能要求不要,就不用管,就当忘了这事。

2.我们可以使用急切创建实例

利用这个方法,我们依赖jvm在加载这个类的时候马上创建唯一的实例。


3.双重检查加锁,在getInstance中减少使用同步

首先检查是否被实例化,如果尚未创建,才进行同步,这样的话只有第一次会同步。


这正是我们想要的,这样我们就可以得到唯一Singleton的实例了.



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值