once用法
目录
使用场景
once常常用来初始化单例资源,或者并发访问只需初始化一次的共享资源,或者在测试的时候初始化一次测试资源
实现
一个正确的once实现要使用一个互斥锁,这样初始化的时候如果有并发的goroutine,就会进入doSlow方法
2种错误
死锁
解决方案:不要在f参数中调用当前的这个once,不管是直接的还是间接的
未初始化
解决方案:可以自己实现一个类似once的并发原语,既可以以返回当前调用do方法是否正确完成,还可以在初始化失败后调用do方法再次尝试初始化,知道初始化成功才不再初始化了