单例模式singleton的几种实现方式

满足单例模式共两点:1一个类只能有一个唯一实例  2提供全局访问点

 

Implementation1

这是很简单的一种实现方式,并存在线程安全的问题。比如线程t1运行至(b)时,突然休眠,这时线程t2从(a)开始运行,线程t1还处在(b)休眠,没有创建实例,此时线程t2从(a)到(b)再到return,创建了实例Obj1。当线程t1苏醒,并从(b)开始运行,创建实例Obj2。所以,该实现方式在多线程的情况下,有可能创建多个实例,违反了Singleton模式一个类只能有一个实例的原则。让我们加以改进,在多线程下花点功夫。
优点:简单
缺点:线程不安全

 

Implementation2

相比Implementation1,仅多了一个synchronized关键字,当线程t1运行getInstance()方法时,获得同步锁,线程t2无法访问该方法,只有当线程t1从getInstance()返回时释放同步锁后,线程t2才能访问。Implmentation2解决了多线程可能产生多个instance的问题。
优点:线程安全
缺点:额外开销,有几个线程就要同步几次

 

Implementation3

Implementation1和2都采用lazy instantiation的方式,即只有当满足一定条件时(instance==null),才被实
例化。我们可以采用eager instantiation,这种方式有个好处,即是线程安全的。当类被加载时,instance
被创建,实例创建时间领先于线程访问,此时无论多少线程访问getInstance(),也只能返回那个在类加载时就
已经创建好的instance。
优点:简单、线程安全
缺点:有时并不想在类加载时就实例化对象

 

Implementation4

这种实现方式叫"double-checked locking",volatile保证了instance在被实例化时多线程能正确的处理实例
变量,它不仅线程安全,而且节省开销,只有在第一个线程访问getInstance()方法时才同步,第一个线程释
放锁后,按照代码逻辑,其他线程不会去获得同步锁。
优点:线程安全,节省开销,lazy insatantiation
缺点:由于volatile的关系,jdk1.5及以后才能使用这种方式

 

参考资料:《Head First Design Patterns》

 

如若转载,请说明出处!http://blog.csdn.net/xukunddp

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值