package lock import ( "sync" ) // WxIdLockManager 管理微信号级别的锁 type WxIdLockManager struct { lockMap map[string]*sync.Mutex mapMu sync.Mutex } var ( wxIdLockManager *WxIdLockManager once sync.Once ) // GetWxIdLockManager 获取单例锁管理器 func GetWxIdLockManager() *WxIdLockManager { once.Do(func() { wxIdLockManager = &WxIdLockManager{ lockMap: make(map[string]*sync.Mutex), } }) return wxIdLockManager } // getLock 获取指定微信号的锁 func (m *WxIdLockManager) getLock(wxid string) *sync.Mutex { m.mapMu.Lock() defer m.mapMu.Unlock() if _, ok := m.lockMap[wxid]; !ok { m.lockMap[wxid] = &sync.Mutex{} } return m.lockMap[wxid] } // RunWithLock 只对某个微信号加锁并执行指定函数 func (m *WxIdLockManager) RunWithLock(wxid string, fn func()) { lock := m.getLock(wxid) lock.Lock() defer lock.Unlock() fn() } var ( lockMap = make(map[string]*sync.Mutex) mapLock = sync.Mutex{} ) func LockWxId(wxid string) { mapLock.Lock() mu, ok := lockMap[wxid] if !ok { mu = &sync.Mutex{} lockMap[wxid] = mu } mapLock.Unlock() mu.Lock() } // UnlockWxId 解锁指定微信号 func UnlockWxId(wxid string) { mapLock.Lock() mu, ok := lockMap[wxid] mapLock.Unlock() if ok { mu.Unlock() } }