41 lines
		
	
	
		
			551 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			551 B
		
	
	
	
		
			Go
		
	
	
	
	
	
package lockkey
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"sync"
 | 
						|
)
 | 
						|
 | 
						|
type LockByKey struct {
 | 
						|
	m map[string]*sync.RWMutex
 | 
						|
	l sync.Mutex
 | 
						|
}
 | 
						|
 | 
						|
func NewLockByKey() *LockByKey {
 | 
						|
	return &LockByKey{m: make(map[string]*sync.RWMutex)}
 | 
						|
}
 | 
						|
 | 
						|
func (lk *LockByKey) Lock(key string) {
 | 
						|
	lk.l.Lock()
 | 
						|
	defer lk.l.Unlock()
 | 
						|
 | 
						|
	mu, ok := lk.m[key]
 | 
						|
	if !ok {
 | 
						|
		mu = &sync.RWMutex{}
 | 
						|
		lk.m[key] = mu
 | 
						|
	}
 | 
						|
 | 
						|
	mu.Lock()
 | 
						|
}
 | 
						|
 | 
						|
func (lk *LockByKey) Unlock(key string) {
 | 
						|
	lk.l.Lock()
 | 
						|
	defer lk.l.Unlock()
 | 
						|
 | 
						|
	mu, ok := lk.m[key]
 | 
						|
	if !ok {
 | 
						|
		panic(fmt.Sprintf("unlock non-existent key: %v", key))
 | 
						|
	}
 | 
						|
 | 
						|
	mu.Unlock()
 | 
						|
}
 |