W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
內(nèi)存鎖模塊,也稱之為動(dòng)態(tài)互斥鎖模塊,支持按照給定鍵名動(dòng)態(tài)生成互斥鎖,并發(fā)安全并支持?Try*Lock
?特性。
當(dāng)維護(hù)大量動(dòng)態(tài)互斥鎖的場(chǎng)景時(shí),如果不再使用的互斥鎖對(duì)象,請(qǐng)手動(dòng)調(diào)用?Remove
?方法刪除掉。
使用方式:
import "github.com/gogf/gf/v2/os/gmlock"
使用場(chǎng)景: 需要?jiǎng)討B(tài)創(chuàng)建互斥鎖,或者需要維護(hù)大量動(dòng)態(tài)鎖的場(chǎng)景;
接口文檔:https://pkg.go.dev/github.com/gogf/gf/v2/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) bool
func TryLockFunc(key string, f func()) bool
func TryRLock(key string) bool
func TryRLockFunc(key string, f func()) bool
func Unlock(key string)
type Locker
func New() *Locker
func (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) bool
func (l *Locker) TryLockFunc(key string, f func()) bool
func (l *Locker) TryRLock(key string) bool
func (l *Locker) TryRLockFunc(key string, f func()) bool
func (l *Locker) Unlock(key string)
package main
import (
"time"
"sync"
"github.com/gogf/gf/v2/os/glog"
"github.com/gogf/gf/v2/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()
}
該示例中,模擬了同時(shí)開啟10個(gè)?goroutine
?,但同一時(shí)刻只能有一個(gè)?goroutine
?獲得鎖,獲得鎖的?goroutine
?執(zhí)行1秒后退出,其他?goroutine
?才能獲得鎖。
執(zhí)行后,輸出結(jié)果為:
2018-10-15 23:57:28.295 9
2018-10-15 23:57:29.296 0
2018-10-15 23:57:30.296 1
2018-10-15 23:57:31.296 2
2018-10-15 23:57:32.296 3
2018-10-15 23:57:33.297 4
2018-10-15 23:57:34.297 5
2018-10-15 23:57:35.297 6
2018-10-15 23:57:36.298 7
2018-10-15 23:57:37.298 8
?TryLock
?方法是有返回值的,它表示用來(lái)嘗試獲取鎖,如果獲取成功,則返回?true
?;如果獲取失?。椿コ怄i已被其他?goroutine
?獲取),則返回?false
?。
package main
import (
"sync"
"github.com/gogf/gf/v2/os/glog"
"time"
"github.com/gogf/gf/v2/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()
}
同理,在該示例中,同時(shí)也只有1個(gè)?goroutine
?能獲得鎖,其他?goroutine
?在?TryLock
?失敗便直接退出了。
執(zhí)行后,輸出結(jié)果為:
2018-10-16 00:01:59.172 9
2018-10-16 00:01:59.172 false
2018-10-16 00:01:59.172 false
2018-10-16 00:01:59.172 false
2018-10-16 00:01:59.172 false
2018-10-16 00:01:59.172 false
2018-10-16 00:01:59.172 false
2018-10-16 00:01:59.172 false
2018-10-16 00:01:59.172 false
2018-10-16 00:01:59.176 false
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: