原子性
单例
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
type A struct {
Item int
}
var a *A
var l sync.RWMutex
func GetGlobalA() *A {
if a != nil {
return a
}
l.Lock()
if a == nil {
rand.Seed(0)
a = &A{Item: rand.Int()}
}
l.Unlock()
return a
}
通常的单例是这么写的,实际上还有一种配合读写锁的写法(从nsq源码中学习到的)
n.RLock()
t, ok := n.topicMap[topicName]
n.RUnlock()
if ok {
return t
}
n.Lock()
t, ok = n.topicMap[topicName]
if ok {
n.Unlock()
return t
}
想到类似的场景再继续补坑吧