wxid_lock.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package lock
  2. import (
  3. "sync"
  4. )
  5. // WxIdLockManager 管理微信号级别的锁
  6. type WxIdLockManager struct {
  7. lockMap map[string]*sync.Mutex
  8. mapMu sync.Mutex
  9. }
  10. var (
  11. wxIdLockManager *WxIdLockManager
  12. once sync.Once
  13. )
  14. // GetWxIdLockManager 获取单例锁管理器
  15. func GetWxIdLockManager() *WxIdLockManager {
  16. once.Do(func() {
  17. wxIdLockManager = &WxIdLockManager{
  18. lockMap: make(map[string]*sync.Mutex),
  19. }
  20. })
  21. return wxIdLockManager
  22. }
  23. // getLock 获取指定微信号的锁
  24. func (m *WxIdLockManager) getLock(wxid string) *sync.Mutex {
  25. m.mapMu.Lock()
  26. defer m.mapMu.Unlock()
  27. if _, ok := m.lockMap[wxid]; !ok {
  28. m.lockMap[wxid] = &sync.Mutex{}
  29. }
  30. return m.lockMap[wxid]
  31. }
  32. // RunWithLock 只对某个微信号加锁并执行指定函数
  33. func (m *WxIdLockManager) RunWithLock(wxid string, fn func()) {
  34. lock := m.getLock(wxid)
  35. lock.Lock()
  36. defer lock.Unlock()
  37. fn()
  38. }
  39. var (
  40. lockMap = make(map[string]*sync.Mutex)
  41. mapLock = sync.Mutex{}
  42. )
  43. func LockWxId(wxid string) {
  44. mapLock.Lock()
  45. mu, ok := lockMap[wxid]
  46. if !ok {
  47. mu = &sync.Mutex{}
  48. lockMap[wxid] = mu
  49. }
  50. mapLock.Unlock()
  51. mu.Lock()
  52. }
  53. // UnlockWxId 解锁指定微信号
  54. func UnlockWxId(wxid string) {
  55. mapLock.Lock()
  56. mu, ok := lockMap[wxid]
  57. mapLock.Unlock()
  58. if ok {
  59. mu.Unlock()
  60. }
  61. }