2019-03-07

golang中遇到的坑之 sync.once.do()

源码:

func (o *Once) Do(f func()) { if atomic.LoadUint32(&o.done) == 1 { return } // Slow-path. o.m.Lock() defer o.m.Unlock() if o.done == 0 { defer atomic.StoreUint32(&o.done, 1) f() }}

这个方法的定义是,只要f函数被执行一次之后就不会再执行,那么弊端就很明显了,如果f函数执行失败需要重新执行的时候,是不能被满足的。

如果需要写单例模式,但是单例初始化依赖于网络或者会出现失败需要重试的时候,还是自己乖乖的用锁来实现吧,不要偷懒用once.do

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,060评论 0 2
  • 第10课:线性回归– 从模型函数到目标函数 1. 机器学习的目标是使我们建立的模型运行结果和理想结果之间的差异尽可...
    Wendy_a4b0阅读 693评论 0 0
  • 作者:奔跑的五花肉 闺蜜有一段时间没在好友群里冒泡了,一@她,原来是她最近被一个心机婊给缠上了。让她每天上班都很痛...
    恋上回忆的小疯子阅读 1,713评论 1 7
  • 为什么我很反感产品经验主义? 工作会经常遇到靠经验做产品的同事或领导,典型表现就是产品思维和方法论还非常滞后,仿佛...
    清水杂谈阅读 1,048评论 2 0
  • 当你走进图书馆 浩如烟海的书籍琳琅满目 当你随意拿起一本 似乎每一本都很有重量 当年作者写作的传言有些还在坊间 书...
    萌龙在天阅读 174评论 0 2