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
|
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 }
|
||||||
|
@ -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
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