sync包once小问题

goCurrent · 2023-09-13 23:55:27 · 3060 次点击

疑问不在于为什么有了原子操作还要加锁,而是有了加锁还要用原子操作, 如下写法会有线程安全问题吗?

type Once struct {
    done uint32
    m    Mutex
}

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

func (o *Once) doSlow(f func()) {
    o.m.Lock()
    defer o.m.Unlock()
    if o.done == 0 {
        defer o.done = 1
        f()
    }
}
#8
更多评论

@kingJ 线程安全是指啥,两个goroutine同时读一个int应该不会panic

#2