开发了一个基于key的加锁方案

kzh125 · · 4656 次点击
看了下你这个代码,确实不能实现并发时同一个key加锁先后执行: 假设有10个并发同时调用`Locker("key1")`,然后其中一个执行完毕并调用`l.Map.Delete(l.Key)`删除,剩下9个。 后面又来了10个并发调用`Locker("key1")`,则后来的10个并发和前面的9个拥有的不是同一个锁,无法起到加锁的作用。所以需要counter,但是不用channel的话,这个真不好实现的,纸上谈兵没用... 另外我觉得你这个代码性能不够好,开始有10个并发同时调用`Locker("key1")`,之后第一个执行完毕后,剩下9个应当立刻返回(例如使用close channel来广播,参考9.7最后的实现),但实际上你这个还要加锁解锁。
#5
更多评论
………… 一个sync.Map,值是sync.Mutex类型就可以了……
#1
找了下我的代码,大概是这样的 func NewUtil() *Util { return &Util{ locks: &sync.Map{}, } } type Util struct { locks *sync.Map } func (u *Util) Locker(key string) (*Locker, bool) { newlocker := &Locker{ Map: u.locks, Key: key, } v, ok := u.locks.LoadOrStore(key, newlocker) return v.(*Locker), ok } type Locker struct { sync.RWMutex Map *sync.Map Key string } func (l *Locker) Unlock() { l.RWMutex.Unlock() l.Map.Delete(l.Key) }
#2