gf/.example/os/gmlock/test_locker.go

97 lines
1.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"fmt"
"math/rand"
"sync"
"time"
"github.com/gogf/gf/os/gmlock"
)
// 测试Locker是否会产生死锁
func main() {
l := gmlock.New()
wg := sync.WaitGroup{}
key := "test"
event := make(chan int)
number := 100000
for i := 0; i < number; i++ {
wg.Add(1)
go func() {
<-event
l.Lock(key)
//fmt.Println("get lock")
l.Unlock(key)
wg.Done()
}()
}
for i := 0; i < number; i++ {
wg.Add(1)
go func() {
<-event
l.RLock(key)
//fmt.Println("get rlock")
l.RUnlock(key)
wg.Done()
}()
}
for i := 0; i < number; i++ {
wg.Add(1)
go func() {
<-event
if l.TryLock(key) {
//fmt.Println("get lock")
l.Unlock(key)
}
wg.Done()
}()
}
for i := 0; i < number; i++ {
wg.Add(1)
go func() {
<-event
if l.TryRLock(key) {
//fmt.Println("get rlock")
l.RUnlock(key)
}
wg.Done()
}()
}
for i := 0; i < number; i++ {
wg.Add(1)
go func() {
<-event
if l.TryLock(key) {
// 模拟业务逻辑的随机处理间隔
time.Sleep(time.Duration(rand.Intn(100)) * time.Millisecond)
l.Unlock(key)
}
wg.Done()
}()
}
for i := 0; i < number; i++ {
wg.Add(1)
go func() {
<-event
if l.TryRLock(key) {
// 模拟业务逻辑的随机处理间隔
time.Sleep(time.Duration(rand.Intn(100)) * time.Millisecond)
l.RUnlock(key)
}
wg.Done()
}()
}
// 使用chan作为事件发送测试指令让所有的goroutine同时执行
close(event)
wg.Wait()
fmt.Println("done!")
}