diff --git a/locker/empty_locker.go b/locker/empty_locker.go index b29d55e..ca4a26b 100644 --- a/locker/empty_locker.go +++ b/locker/empty_locker.go @@ -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 } diff --git a/locker/locker.go b/locker/locker.go index 82d214a..ed63ea4 100644 --- a/locker/locker.go +++ b/locker/locker.go @@ -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{}} +} + diff --git a/locker/rw_locker.go b/locker/rw_locker.go new file mode 100644 index 0000000..ed7d0c5 --- /dev/null +++ b/locker/rw_locker.go @@ -0,0 +1,13 @@ +package locker + +import "sync" + +var _ RWLocker = &rwLocker{} + +type rwLocker struct { + *sync.RWMutex +} + +func NewRWLocker() *rwLocker { + return &rwLocker{RWMutex: &sync.RWMutex{}} +} diff --git a/locker/rw_locker_test.go b/locker/rw_locker_test.go new file mode 100644 index 0000000..2b21c54 --- /dev/null +++ b/locker/rw_locker_test.go @@ -0,0 +1,12 @@ +package locker + +import "testing" + +func TestRWLokcer(t *testing.T) { + l := NewRWLocker() + l.RLock() + + t.Log(l.TryRLock()) + + l.RUnlock() +} diff --git a/locker/source_locker.go b/locker/source_locker.go new file mode 100644 index 0000000..82d214a --- /dev/null +++ b/locker/source_locker.go @@ -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() + } +}