- gmlock
- 示例1,基本使用
- 示例2,TryLock非阻塞锁
gmlock
内存锁模块,也称之为动态互斥锁模块,支持按照给定键名动态生成互斥锁,并发安全并支持Try*Lock特性。
当维护大量动态互斥锁的场景时,如果不再使用的互斥锁对象,请手动调用
Remove方法删除掉。
使用方式:
import "github.com/gogf/gf/g/os/gmlock"
使用场景:需要动态创建互斥锁,或者需要维护大量动态锁的场景;
接口文档:
https://godoc.org/github.com/gogf/gf/g/os/gmlock
func Lock(key string)func LockFunc(key string, f func())func RLock(key string)func RLockFunc(key string, f func())func RUnlock(key string)func Remove(key string)func TryLock(key string) boolfunc TryLockFunc(key string, f func()) boolfunc TryRLock(key string) boolfunc TryRLockFunc(key string, f func()) boolfunc Unlock(key string)type Lockerfunc New() *Lockerfunc (l *Locker) Clear()func (l *Locker) Lock(key string)func (l *Locker) LockFunc(key string, f func())func (l *Locker) RLock(key string)func (l *Locker) RLockFunc(key string, f func())func (l *Locker) RUnlock(key string)func (l *Locker) Remove(key string)func (l *Locker) TryLock(key string) boolfunc (l *Locker) TryLockFunc(key string, f func()) boolfunc (l *Locker) TryRLock(key string) boolfunc (l *Locker) TryRLockFunc(key string, f func()) boolfunc (l *Locker) Unlock(key string)
示例1,基本使用
package mainimport ("time""sync""github.com/gogf/gf/g/os/glog""github.com/gogf/gf/g/os/gmlock")func main() {key := "lock"wg := sync.WaitGroup{}for i := 0; i < 10; i++ {wg.Add(1)go func(i int) {gmlock.Lock(key)glog.Println(i)time.Sleep(time.Second)gmlock.Unlock(key)wg.Done()}(i)}wg.Wait()}
该示例中,模拟了同时开启10个goroutine,但同一时刻只能有一个goroutine获得锁,获得锁的goroutine执行1秒后退出,其他goroutine才能获得锁。
执行后,输出结果为:
2018-10-15 23:57:28.295 92018-10-15 23:57:29.296 02018-10-15 23:57:30.296 12018-10-15 23:57:31.296 22018-10-15 23:57:32.296 32018-10-15 23:57:33.297 42018-10-15 23:57:34.297 52018-10-15 23:57:35.297 62018-10-15 23:57:36.298 72018-10-15 23:57:37.298 8
示例2,TryLock非阻塞锁
TryLock方法是有返回值的,它表示用来尝试获取锁,如果获取成功,则返回true;如果获取失败(即互斥锁已被其他goroutine获取),则返回false。
package mainimport ("sync""github.com/gogf/gf/g/os/glog""time""github.com/gogf/gf/g/os/gmlock")func main() {key := "lock"wg := sync.WaitGroup{}for i := 0; i < 10; i++ {wg.Add(1)go func(i int) {if gmlock.TryLock(key) {glog.Println(i)time.Sleep(time.Second)gmlock.Unlock(key)} else {glog.Println(false)}wg.Done()}(i)}wg.Wait()}
同理,在该示例中,同时也只有1个goroutine能获得锁,其他goroutine在TryLock失败便直接退出了。
执行后,输出结果为:
2018-10-16 00:01:59.172 92018-10-16 00:01:59.172 false2018-10-16 00:01:59.172 false2018-10-16 00:01:59.172 false2018-10-16 00:01:59.172 false2018-10-16 00:01:59.172 false2018-10-16 00:01:59.172 false2018-10-16 00:01:59.172 false2018-10-16 00:01:59.172 false2018-10-16 00:01:59.176 false
