30 lines
474 B
Go
30 lines
474 B
Go
|
|
package pool
|
||
|
|
|
||
|
|
import "sync"
|
||
|
|
|
||
|
|
type keyMutex struct {
|
||
|
|
muxes sync.Map
|
||
|
|
}
|
||
|
|
|
||
|
|
func (k *keyMutex) TryLock(key string) bool {
|
||
|
|
mux, _ := k.muxes.LoadOrStore(key, &sync.Mutex{})
|
||
|
|
keyMux := mux.(*sync.Mutex)
|
||
|
|
return keyMux.TryLock()
|
||
|
|
}
|
||
|
|
|
||
|
|
func (k *keyMutex) Unlock(key string, remove bool) {
|
||
|
|
mux, ok := k.muxes.Load(key)
|
||
|
|
if !ok {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
keyMux := mux.(*sync.Mutex)
|
||
|
|
if remove {
|
||
|
|
k.Delete(key)
|
||
|
|
}
|
||
|
|
keyMux.Unlock()
|
||
|
|
}
|
||
|
|
|
||
|
|
func (k *keyMutex) Delete(key string) {
|
||
|
|
k.muxes.Delete(key)
|
||
|
|
}
|