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

kzh125 · · 4306 次点击
第一次unlock后就释放整个key的锁: 有点类似cache,第一次取的时候缓存没有,需要加锁获取到缓存里,后续直接从缓存获取。可以参考The Go Programming Language的第9章的`9.7. Example: Concurrent Non-Blocking Cache` 的实现。 这个9.7最后也用了一个单独的channel来实现,因为这样性能比较好。如果使用共享变量,老是要加锁解锁的访问共享变量的内容,并且写的代码容易出bug。使用channel实现的话,代码可读性高,易于理解。 毕竟Go比较著名的谚语是:Don't communicate by sharing memory, share memory by communicating. 我这个场景是同一时间相同key,需要先后执行,不能同一时间执行,所以需要counter。 我先看下你的代码
#4
更多评论
………… 一个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