设计模式--单件模式(Singleton)

Singleton

 

在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率,比方说:线程池(threadpool)、缓存(cache)、对话框、处理偏好设置和注册表的对象、日志对象,充当打印机、显卡等设备的驱动程序的对象。这些类对象只能有一个实例,如果制造出多个实例,就会导致许多问题产生,例如:程序的行为异常、资源使用过量躲着是不一致的结果。遇到这种情况,我们可以通过单件模式来实现,这个模式保证在任何时刻都只有一个对象。

  • 定义: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。

通过维护一个static的成员变量来记录这个唯一的对象实例。

通过提供一个static的接口instance来获得这个唯一的实例。

  • 适用性:

      (1) 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。

      (2) 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

 

  • 代码实现:

(1) 单线程Singleton实现

 

 

      以上代码在单线程情况下不会出现任何问题。但是在多线程的情况下却不是安全的。如两个线程同时运行到 if (instance == null)判断是否被实例化,一个线程判断为True后,在进行创建instance = new SingleThread_Singleton();之前,另一个线程也判断(instance == null),结果也为True。这样就就违背了Singleton模式的原则(保证一个类仅有一个实例)。

 

(2) 多线程Singleton实现 引入线程保护代码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值