59 lines
1002 B
Plaintext
59 lines
1002 B
Plaintext
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)
|
|
}
|