package keyLock
import (
"sync"
"sync/atomic"
"time"
)
const (
defaultCleanInterval = 24 * time.Hour //默认24小时清理一次
)
type KeyLock struct {
locks map[string]*innerLock //关键字锁map
cleanInterval time.Duration //定时清除时间间隔
stopChan chan struct{} //停止信号
mutex sync.RWMutex //全局读写锁
}
func NewKeyLock() *KeyLock {
return &KeyLock{
locks: make(map[string]*innerLock),
cleanInterval: defaultCleanInterval,
stopChan: make(chan struct{}),
}
}
//根据关键字加锁
func (l *KeyLock) Lock(key string) {
l.mutex.RLock()
keyLock, ok := l.locks[key]
if ok {
keyLock.add()
}
l.mutex.RUnlock()
if !ok {
l.mutex.Lock()
keyLock, ok = l.locks[key]
if !ok {
keyLock = newInnerLock()
l.locks[key] = keyLock
}
keyLock.add()
l.mutex.Unlock()
}
keyLock.Lock()
}
//根据关键字解锁
func (l *KeyLock) Unlock(key string) {
l.mutex.RLock()
keyLock, ok
go实现keyLock,根据关键字加锁
最新推荐文章于 2022-08-18 17:09:18 发布