mirror of
https://github.com/charlienet/go-mixed.git
synced 2025-07-17 16:12:42 +08:00
97 lines
1.4 KiB
Go
97 lines
1.4 KiB
Go
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
|
|
}
|