12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- 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()
- }
- }
|