2018-09-05 18:34:41 +08:00
|
|
|
|
package rwmutex
|
|
|
|
|
|
|
|
|
|
|
|
import "sync"
|
|
|
|
|
|
|
|
|
|
|
|
// RWMutex的封装,支持对并发安全开启/关闭的控制。
|
|
|
|
|
|
// 但是只能初始化时确定并发安全性,不能在运行时动态修改并发安全特性设置。
|
|
|
|
|
|
type RWMutex struct {
|
|
|
|
|
|
sync.RWMutex
|
|
|
|
|
|
safe bool
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func New(safe...bool) *RWMutex {
|
|
|
|
|
|
mu := new(RWMutex)
|
|
|
|
|
|
if len(safe) > 0 {
|
|
|
|
|
|
mu.safe = safe[0]
|
|
|
|
|
|
} else {
|
|
|
|
|
|
mu.safe = true
|
|
|
|
|
|
}
|
|
|
|
|
|
return mu
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-09-16 10:51:02 +08:00
|
|
|
|
func (mu *RWMutex) IsSafe() bool {
|
|
|
|
|
|
return mu.safe
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-09-06 14:48:55 +08:00
|
|
|
|
func (mu *RWMutex) Lock(force...bool) {
|
|
|
|
|
|
if mu.safe || (len(force) > 0 && force[0]) {
|
2018-09-05 18:34:41 +08:00
|
|
|
|
mu.RWMutex.Lock()
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-09-06 14:48:55 +08:00
|
|
|
|
func (mu *RWMutex) Unlock(force...bool) {
|
|
|
|
|
|
if mu.safe || (len(force) > 0 && force[0]) {
|
2018-09-05 18:34:41 +08:00
|
|
|
|
mu.RWMutex.Unlock()
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-09-06 14:48:55 +08:00
|
|
|
|
func (mu *RWMutex) RLock(force...bool) {
|
|
|
|
|
|
if mu.safe || (len(force) > 0 && force[0]) {
|
2018-09-05 18:34:41 +08:00
|
|
|
|
mu.RWMutex.RLock()
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-09-06 14:48:55 +08:00
|
|
|
|
func (mu *RWMutex) RUnlock(force...bool) {
|
|
|
|
|
|
if mu.safe || (len(force) > 0 && force[0]) {
|
2018-09-05 18:34:41 +08:00
|
|
|
|
mu.RWMutex.RUnlock()
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|