1
0
mirror of https://github.com/charlienet/go-mixed.git synced 2025-07-18 00:22:41 +08:00
This commit is contained in:
2022-05-12 14:32:36 +08:00
parent 08309e4a49
commit 8e33d9dd92
5 changed files with 75 additions and 16 deletions

View File

@ -1,8 +1,9 @@
package locker package locker
import "sync" // 空锁
var _ sync.Locker = &emptyLocker{} var _ Locker = &emptyLocker{}
var _ RWLocker = &emptyLocker{}
type emptyLocker struct{} type emptyLocker struct{}
@ -10,6 +11,14 @@ func NewEmptyLocker() *emptyLocker {
return &emptyLocker{} return &emptyLocker{}
} }
func (l *emptyLocker) RLock() {}
func (l *emptyLocker) RUnlock() {}
func (l *emptyLocker) Lock() {} func (l *emptyLocker) Lock() {}
func (l *emptyLocker) Unlock() {} func (l *emptyLocker) Unlock() {}
func (l *emptyLocker) TryLock() bool { return true }
func (l *emptyLocker) TryRLock() bool { return true }

View File

@ -2,20 +2,24 @@ package locker
import "sync" import "sync"
var locks = make(map[string]sync.Locker) type Locker interface {
Lock()
func Lock(name string) { Unlock()
if l, ok := locks[name]; ok { TryLock() bool
l.Lock()
}
new := &sync.Mutex{}
locks[name] = new
new.Lock()
} }
func Unlock(name string) { type RWLocker interface {
if l, ok := locks[name]; ok { Locker
l.Unlock() RLock()
} RUnlock()
TryRLock() bool
} }
type locker struct {
*sync.Mutex
}
func NewLocker() *locker {
return &locker{Mutex: &sync.Mutex{}}
}

13
locker/rw_locker.go Normal file
View File

@ -0,0 +1,13 @@
package locker
import "sync"
var _ RWLocker = &rwLocker{}
type rwLocker struct {
*sync.RWMutex
}
func NewRWLocker() *rwLocker {
return &rwLocker{RWMutex: &sync.RWMutex{}}
}

12
locker/rw_locker_test.go Normal file
View File

@ -0,0 +1,12 @@
package locker
import "testing"
func TestRWLokcer(t *testing.T) {
l := NewRWLocker()
l.RLock()
t.Log(l.TryRLock())
l.RUnlock()
}

21
locker/source_locker.go Normal file
View File

@ -0,0 +1,21 @@
package locker
import "sync"
var locks = make(map[string]sync.Locker)
func Lock(name string) {
if l, ok := locks[name]; ok {
l.Lock()
}
new := &sync.Mutex{}
locks[name] = new
new.Lock()
}
func Unlock(name string) {
if l, ok := locks[name]; ok {
l.Unlock()
}
}