sync.Once表示只执行一次函数,是开箱即用的。
1 | type Once struct { |
- done字段作为计数器,统计函数执行次数。通过该计数器来判断是否执行一次。
- m字段保证线程安全,保障在多G情况下,函数严格只执行一次。
1 | func (o *Once) Do(f func()) { |
1 | func (o *Once) doSlow(f func()) { |
- Do()为public方法,首先原子load函数执行次数,如果已经执行过了,就return。
- doSlow()方法执行传入函数,但前方法进行锁的保护。首先进行一次双重检查,判断是否执行过。如果没有执行,则指定传入函数。然后计数器加一。