当前位置:   article > 正文

【go从入门到精通】精通并发编程-sync.Once

【go从入门到精通】精通并发编程-sync.Once

        在编程的很多场景下我们需要确保某些操作在高并发的场景下只执行一次,例如只加载一次配置文件、只关闭一次通道等。

sync.Once

Go语言中的sync包中提供了一个针对只执行一次场景的解决方案–sync.Once。

sync.Once只有一个Do方法,其定义如下:

func (o *Once) Do(f func()) {} 

注意:如果要执行的函数f需要传递参数就需要搭配闭包来使用。

实现原理

每一个sync.Once结构体中都只包含一个用于标识代码块是否执行过的done标记以及一个互斥锁 Mutex:

  1. type Once struct {
  2. done uint32
  3. m Mutex
  4. }

 并且这个结构体只提供两个方法:

  1. func (o *Once) Do(f func()) {
  2. // Note: Here is an incorrect implementation of Do:
  3. //
  4. // if atomic.CompareAndSwapUint32(&o.done, 0, 1) {
  5. // f()
  6. // }
  7. //
  8. // Do guarantees that when it returns, f has finished.
  9. /
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/662054
推荐阅读
相关标签
  

闽ICP备14008679号