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

kzh125 · · 4664 次点击
看了遍你的代码,知道你要干什么了。 你要解决的不是并发的问题,是要解决唯一的问题。 那更简单,一个全局锁的问题。 ```go package xsync import "sync" func NewUtil() *Util { return &Util{ locks: map[interface{}]*Locker{}, } } type Util struct { locker sync.Mutex locks map[interface{}]*Locker } func (u *Util) Locker(key interface{}) (*Locker, bool) { u.locker.Lock() l, ok := u.locks[key] if !ok { l = &Locker{ Util: u, Key: key, } u.locks[key] = l } u.locker.Unlock() return l, ok } type Locker struct { sync.RWMutex Util *Util count int Key interface{} } func (l *Locker) Close() { l.Util.locker.Lock() l.count-- if l.count == 0 { delete(l.Util.locks, l.Key) } l.Util.locker.Unlock() } ```
#17
更多评论
………… 一个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