go once源码分析


代码

package sync

import (
	"sync"
	"sync/atomic"
)

type Once struct {
	done atomic.Uint32
	m    sync.Mutex
}

func (o *Once) Do(f func()) {
	if o.done.Load() == 0 {
		o.doSlow(f)
	}
}

func (o *Once) doSlow(f func()) {
	o.m.Lock()
	defer o.m.Unlock()
	if o.done.Load() == 0 {
		defer o.done.Store(1)
		f()
	}
}

分析

go once源码非常少,先看看数据结构

type Once struct {
	done atomic.Uint32
	m    sync.Mutex
}

就2个字段

  • done:原子遍历
  • m:互斥锁

Do函数其实非常简单,首先判断一下原子遍历done值是否等于0,如果等于0,就执行f函数,并且将值修改成1,这个修改和执行f函数加

```go锁
``go

文章作者: Alex
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Alex !
  目录