1. 如何使用Channel模拟锁
最后更新于
这有帮助吗?
最后更新于
这有帮助吗?
这有帮助吗?
此开源图书由ithaiq原创,创作不易转载请注明出处
我们封装一个struct操作mutex锁
type Test struct {
count int
g sync.Mutex
}
func (t *Test) add() {
t.mutex.Lock()
defer t.mutex.Unlock()
t.count++
}
func (t *Test) reduce() {
t.mutex.Lock()
defer t.mutex.Unlock()
t.count--
}
2. 愉快的执行main函数测试
func main() {
var t = &Test{}
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
for i := 0; i < 100000; i++ {
t.add()
}
}()
go func() {
defer wg.Done()
for i := 0; i < 100000; i++ {
t.reduce()
}
}()
wg.Wait()
fmt.Println(t.count)
}
3. 重头戏使用channel模拟锁
type Lock struct {
ch chan struct{}
}
func (l *Lock) Lock() {
l.ch <- struct{}{}
}
func (l *Lock) Unlock() {
select {
case <-l.ch:
default:
panic("不可重复解锁")
}
}
4. 最后我们把Test结构体里面的mutex字段类型换成*Lock,完美perfect