mirror of
https://github.com/charlienet/go-mixed.git
synced 2025-07-18 08:32:40 +08:00
update
This commit is contained in:
@ -1,5 +1,8 @@
|
||||
package locker
|
||||
|
||||
var _ RWLocker = &emptyLocker{}
|
||||
var _ Locker = &emptyLocker{}
|
||||
|
||||
var EmptyLocker = &emptyLocker{}
|
||||
|
||||
type emptyLocker struct{}
|
||||
|
96
locker/synchronizeable.go
Normal file
96
locker/synchronizeable.go
Normal file
@ -0,0 +1,96 @@
|
||||
package locker
|
||||
|
||||
import (
|
||||
"log"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type WithLocker struct {
|
||||
once sync.Once
|
||||
mu Locker
|
||||
}
|
||||
|
||||
func (w *WithLocker) Synchronize() {
|
||||
if w.mu == nil || w.mu == EmptyLocker {
|
||||
w.mu = NewLocker()
|
||||
}
|
||||
}
|
||||
|
||||
func (w *WithLocker) Lock() {
|
||||
w.ensureLocker().Lock()
|
||||
}
|
||||
|
||||
func (w *WithLocker) Unlock() {
|
||||
w.ensureLocker().Unlock()
|
||||
}
|
||||
|
||||
func (w *WithLocker) TryLock() bool {
|
||||
return w.ensureLocker().TryLock()
|
||||
}
|
||||
|
||||
func (w *WithLocker) ensureLocker() Locker {
|
||||
w.once.Do(func() {
|
||||
if w.mu == nil {
|
||||
w.mu = EmptyLocker
|
||||
}
|
||||
})
|
||||
|
||||
return w.mu
|
||||
}
|
||||
|
||||
type WithSpinLocker struct {
|
||||
WithLocker
|
||||
}
|
||||
|
||||
func (w *WithSpinLocker) Synchronize() {
|
||||
if w.mu == nil || w.mu == EmptyLocker {
|
||||
w.mu = NewSpinLocker()
|
||||
}
|
||||
}
|
||||
|
||||
type WithRWLocker struct {
|
||||
once sync.Once
|
||||
mu RWLocker
|
||||
}
|
||||
|
||||
func (w *WithRWLocker) Synchronize() {
|
||||
if w.mu == nil || w.mu == EmptyLocker {
|
||||
log.Println("初始化有效锁")
|
||||
w.mu = NewRWLocker()
|
||||
}
|
||||
}
|
||||
|
||||
func (w *WithRWLocker) Lock() {
|
||||
w.ensureLocker().Lock()
|
||||
}
|
||||
|
||||
func (w *WithRWLocker) TryLock() bool {
|
||||
return w.ensureLocker().TryLock()
|
||||
}
|
||||
|
||||
func (w *WithRWLocker) Unlock() {
|
||||
w.ensureLocker().Unlock()
|
||||
}
|
||||
|
||||
func (w *WithRWLocker) RLock() {
|
||||
w.ensureLocker().RLock()
|
||||
}
|
||||
|
||||
func (w *WithRWLocker) TryRLock() bool {
|
||||
return w.ensureLocker().TryRLock()
|
||||
}
|
||||
|
||||
func (w *WithRWLocker) RUnlock() {
|
||||
w.ensureLocker().RUnlock()
|
||||
}
|
||||
|
||||
func (w *WithRWLocker) ensureLocker() RWLocker {
|
||||
w.once.Do(func() {
|
||||
if w.mu == nil {
|
||||
log.Println("初始化一个空锁")
|
||||
w.mu = EmptyLocker
|
||||
}
|
||||
})
|
||||
|
||||
return w.mu
|
||||
}
|
Reference in New Issue
Block a user