搬迁easy lock
This commit is contained in:
commit
72952dc746
22
.gitignore
vendored
Normal file
22
.gitignore
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
# Created by .ignore support plugin (hsz.mobi)
|
||||
### Go template
|
||||
# Binaries for programs and plugins
|
||||
*.exe
|
||||
*.exe~
|
||||
*.dll
|
||||
*.so
|
||||
*.dylib
|
||||
*.xlsx
|
||||
|
||||
# Test binary, built with `go test -c`
|
||||
*.test
|
||||
|
||||
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||
*.out
|
||||
|
||||
# Dependency directories (remove the comment below to include it)
|
||||
# vendor/
|
||||
.idea
|
||||
.vscode
|
||||
mail_test.go
|
||||
|
26
abstruct.go
Normal file
26
abstruct.go
Normal file
@ -0,0 +1,26 @@
|
||||
// Package easylock ...
|
||||
//
|
||||
// Description : easylock ...
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 2021-02-24 6:29 下午
|
||||
package easylock
|
||||
|
||||
// EasyLock ...
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 4:18 下午 2021/4/1
|
||||
type EasyLock interface {
|
||||
// Lock ...
|
||||
Lock(optionFuncList ...OptionFunc) error
|
||||
// Unlock ...
|
||||
Unlock(optionFuncList ...OptionFunc) error
|
||||
// RLock ...
|
||||
RLock(optionFuncList ...OptionFunc) error
|
||||
// RUnlock ...
|
||||
RUnlock(optionFuncList ...OptionFunc) error
|
||||
// GetLockCnt 获取锁总数
|
||||
GetLockCnt() *LockCnt
|
||||
}
|
92
define.go
Normal file
92
define.go
Normal file
@ -0,0 +1,92 @@
|
||||
// Package easylock ...
|
||||
//
|
||||
// Description : easylock ...
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 2021-04-01 4:13 下午
|
||||
package easylock
|
||||
|
||||
type option struct {
|
||||
flag string // 锁的标识
|
||||
}
|
||||
|
||||
// OptionFunc 设置option选项
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 4:15 下午 2021/4/1
|
||||
type OptionFunc func(o *option)
|
||||
|
||||
// WithFlag 设置flag
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 4:17 下午 2021/4/1
|
||||
func WithFlag(flag string) OptionFunc {
|
||||
return func(o *option) {
|
||||
o.flag = flag
|
||||
}
|
||||
}
|
||||
|
||||
// LockCnt 计数lockCnt
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 4:41 下午 2021/4/1
|
||||
type LockCnt struct {
|
||||
Write int64 `json:"write"`
|
||||
Read int64 `json:"read"`
|
||||
}
|
||||
|
||||
type base struct {
|
||||
}
|
||||
|
||||
// ParseOption 解析option
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 4:24 下午 2021/4/1
|
||||
func (b *base) ParseOption(optionFuncList ...OptionFunc) *option {
|
||||
o := &option{}
|
||||
for _, f := range optionFuncList {
|
||||
f(o)
|
||||
}
|
||||
return o
|
||||
}
|
||||
|
||||
// AddLockCnt 锁数量加一
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 4:44 下午 2021/4/1
|
||||
func (b *base) AddLockCnt(lockCnt *LockCnt) {
|
||||
lockCnt.Write++
|
||||
}
|
||||
|
||||
// DecreaseLockCnt 锁数量
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 4:45 下午 2021/4/1
|
||||
func (b *base) DecreaseLockCnt(lockCnt *LockCnt) {
|
||||
lockCnt.Write--
|
||||
}
|
||||
|
||||
// AddRLockCnt 锁数量加一
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 4:44 下午 2021/4/1
|
||||
func (b *base) AddRLockCnt(lockCnt *LockCnt) {
|
||||
lockCnt.Read++
|
||||
}
|
||||
|
||||
// DecreaseRLockCnt 锁数量
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 4:45 下午 2021/4/1
|
||||
func (b *base) DecreaseRLockCnt(lockCnt *LockCnt) {
|
||||
lockCnt.Read--
|
||||
}
|
19
error.go
Normal file
19
error.go
Normal file
@ -0,0 +1,19 @@
|
||||
// Package easylock ...
|
||||
//
|
||||
// Description : easylock ...
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 2021-02-24 10:55 下午
|
||||
package easylock
|
||||
|
||||
import "github.com/pkg/errors"
|
||||
|
||||
// segmentError ...
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 1:44 下午 2021/2/24
|
||||
func segmentError() error {
|
||||
return errors.New("segment需要大于0")
|
||||
}
|
13
go.mod
Normal file
13
go.mod
Normal file
@ -0,0 +1,13 @@
|
||||
module easylock
|
||||
|
||||
go 1.17
|
||||
|
||||
require (
|
||||
git.zhangdeman.cn/zhangdeman/util v0.0.0-20220514075609-25936d457a72
|
||||
github.com/pkg/errors v0.9.1
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/spaolacci/murmur3 v1.1.0 // indirect
|
||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||
)
|
10
go.sum
Normal file
10
go.sum
Normal file
@ -0,0 +1,10 @@
|
||||
git.zhangdeman.cn/zhangdeman/util v0.0.0-20220514075609-25936d457a72 h1:kPx8DFXmsyBeEiLjolzG8ZlIGYUhBbTWcn65AuMGLy8=
|
||||
git.zhangdeman.cn/zhangdeman/util v0.0.0-20220514075609-25936d457a72/go.mod h1:YI/XeTmrr9+8dxa4ThPkmNcEE8WHG5pZkKujpSWwIxM=
|
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
|
||||
github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
59
lock.go
Normal file
59
lock.go
Normal file
@ -0,0 +1,59 @@
|
||||
// Package easylock ...
|
||||
//
|
||||
// Description : 包装各种姿势的锁
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 2021-02-24 6:26 下午
|
||||
package easylock
|
||||
|
||||
import "sync"
|
||||
|
||||
// NewLock 获取普通锁实例,因为只有一把锁,flag没有意义,传空即可
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 10:42 下午 2021/2/24
|
||||
func NewLock() EasyLock {
|
||||
return &lock{
|
||||
sc: &sync.RWMutex{},
|
||||
lockCnt: &LockCnt{
|
||||
Write: 0,
|
||||
Read: 0,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
type lock struct {
|
||||
sc *sync.RWMutex
|
||||
lockCnt *LockCnt
|
||||
base
|
||||
}
|
||||
|
||||
func (l *lock) Lock(optionFuncList ...OptionFunc) error {
|
||||
defer l.AddLockCnt(l.lockCnt)
|
||||
l.sc.Lock()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (l *lock) Unlock(optionFuncList ...OptionFunc) error {
|
||||
defer l.DecreaseLockCnt(l.lockCnt)
|
||||
l.sc.Unlock()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (l *lock) RLock(optionFuncList ...OptionFunc) error {
|
||||
defer l.AddRLockCnt(l.lockCnt)
|
||||
l.sc.RLock()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (l *lock) RUnlock(optionFuncList ...OptionFunc) error {
|
||||
defer l.DecreaseRLockCnt(l.lockCnt)
|
||||
l.sc.RUnlock()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (l *lock) GetLockCnt() *LockCnt {
|
||||
return l.lockCnt
|
||||
}
|
68
lock_segment.go
Normal file
68
lock_segment.go
Normal file
@ -0,0 +1,68 @@
|
||||
// Package easylock ...
|
||||
//
|
||||
// Description : 分段的锁
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 2021-02-24 10:44 下午
|
||||
package easylock
|
||||
|
||||
import "git.zhangdeman.cn/zhangdeman/util"
|
||||
|
||||
// NewSegment 获取分段锁
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 11:20 下午 2021/2/24
|
||||
func NewSegment(segmentCnt int) (EasyLock, error) {
|
||||
if segmentCnt <= 0 {
|
||||
return nil, segmentError()
|
||||
}
|
||||
s := &segment{
|
||||
lockTable: make([]EasyLock, segmentCnt),
|
||||
segmentCnt: segmentCnt,
|
||||
lockCnt: &LockCnt{
|
||||
Write: 0,
|
||||
Read: 0,
|
||||
},
|
||||
}
|
||||
for i := 0; i < segmentCnt; i++ {
|
||||
s.lockTable[i] = NewLock()
|
||||
}
|
||||
return s, nil
|
||||
}
|
||||
|
||||
type segment struct {
|
||||
lockTable []EasyLock
|
||||
segmentCnt int
|
||||
lockCnt *LockCnt
|
||||
base
|
||||
}
|
||||
|
||||
func (s *segment) Lock(optionFuncList ...OptionFunc) error {
|
||||
defer s.AddRLockCnt(s.lockCnt)
|
||||
o := s.ParseOption(optionFuncList...)
|
||||
return s.lockTable[util.Hash.GetHashIDMod(o.flag, s.segmentCnt)].Lock()
|
||||
}
|
||||
|
||||
func (s *segment) Unlock(optionFuncList ...OptionFunc) error {
|
||||
defer s.DecreaseLockCnt(s.lockCnt)
|
||||
o := s.ParseOption(optionFuncList...)
|
||||
return s.lockTable[util.Hash.GetHashIDMod(o.flag, s.segmentCnt)].Unlock()
|
||||
}
|
||||
|
||||
func (s *segment) RLock(optionFuncList ...OptionFunc) error {
|
||||
defer s.AddRLockCnt(s.lockCnt)
|
||||
o := s.ParseOption(optionFuncList...)
|
||||
return s.lockTable[util.Hash.GetHashIDMod(o.flag, s.segmentCnt)].RLock()
|
||||
}
|
||||
|
||||
func (s *segment) RUnlock(optionFuncList ...OptionFunc) error {
|
||||
defer s.DecreaseRLockCnt(s.lockCnt)
|
||||
o := s.ParseOption(optionFuncList...)
|
||||
return s.lockTable[util.Hash.GetHashIDMod(o.flag, s.segmentCnt)].RUnlock()
|
||||
}
|
||||
|
||||
func (s *segment) GetLockCnt() *LockCnt {
|
||||
return s.lockCnt
|
||||
}
|
Loading…
Reference in New Issue
Block a user