goProject/trunk/goutil/syncUtil/lockerUtil.go

59 lines
1002 B
Go
Raw Permalink Normal View History

2025-01-06 16:01:02 +08:00
package syncUtil
import (
"sync"
)
// 锁工具类
type LockerUtil struct {
// 锁集合
lockerMap map[string]*Locker
// 锁对象
rwMutex sync.RWMutex
}
// 创建新的锁工具类
func NewLockerUtil() *LockerUtil {
return &LockerUtil{
lockerMap: make(map[string]*Locker, 8),
}
}
// 获取锁对象
// lockName:锁名
// 返回值:
// *Locker:锁对象
func (this *LockerUtil) GetLock(lockName string) *Locker {
var lockerObj *Locker
var exists bool
func() {
this.rwMutex.RLock()
defer this.rwMutex.RUnlock()
lockerObj, exists = this.lockerMap[lockName]
}()
if exists {
return lockerObj
}
this.rwMutex.Lock()
defer this.rwMutex.Unlock()
lockerObj, exists = this.lockerMap[lockName]
if !exists {
lockerObj = NewLocker()
this.lockerMap[lockName] = lockerObj
}
return lockerObj
}
// 释放锁对象
// lockName:锁名
func (this *LockerUtil) ReleaseLock(lockName string) {
this.rwMutex.Lock()
defer this.rwMutex.Unlock()
delete(this.lockerMap, lockName)
}