mirror of
https://github.com/charlienet/go-mixed.git
synced 2025-07-18 00:22:41 +08:00
locker
This commit is contained in:
@ -1,8 +1,9 @@
|
||||
package locker
|
||||
|
||||
import "sync"
|
||||
// 空锁
|
||||
|
||||
var _ sync.Locker = &emptyLocker{}
|
||||
var _ Locker = &emptyLocker{}
|
||||
var _ RWLocker = &emptyLocker{}
|
||||
|
||||
type emptyLocker struct{}
|
||||
|
||||
@ -10,6 +11,14 @@ func NewEmptyLocker() *emptyLocker {
|
||||
return &emptyLocker{}
|
||||
}
|
||||
|
||||
func (l *emptyLocker) RLock() {}
|
||||
|
||||
func (l *emptyLocker) RUnlock() {}
|
||||
|
||||
func (l *emptyLocker) Lock() {}
|
||||
|
||||
func (l *emptyLocker) Unlock() {}
|
||||
|
||||
func (l *emptyLocker) TryLock() bool { return true }
|
||||
|
||||
func (l *emptyLocker) TryRLock() bool { return true }
|
||||
|
@ -2,20 +2,24 @@ 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()
|
||||
type Locker interface {
|
||||
Lock()
|
||||
Unlock()
|
||||
TryLock() bool
|
||||
}
|
||||
|
||||
func Unlock(name string) {
|
||||
if l, ok := locks[name]; ok {
|
||||
l.Unlock()
|
||||
}
|
||||
type RWLocker interface {
|
||||
Locker
|
||||
RLock()
|
||||
RUnlock()
|
||||
TryRLock() bool
|
||||
}
|
||||
|
||||
type locker struct {
|
||||
*sync.Mutex
|
||||
}
|
||||
|
||||
func NewLocker() *locker {
|
||||
return &locker{Mutex: &sync.Mutex{}}
|
||||
}
|
||||
|
||||
|
13
locker/rw_locker.go
Normal file
13
locker/rw_locker.go
Normal 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
12
locker/rw_locker_test.go
Normal 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
21
locker/source_locker.go
Normal 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()
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user