用一个缓存空间的channel实现锁比较简单,如果是无缓存就会稍微麻烦点
直接上代码了:
package samples
type Mutex struct {
m chan struct{}
}
func NewMutex() *Mutex {
m := &Mutex{
m: make(chan struct{}),
}
go m.run()
return m
}
func (m *Mutex) Lock() {
m.m <- struct{}{}
}
func (m *Mutex) Unlock() {
<-m.m
}
func (m *Mutex) run() {
for {
select {
case <- m.m:
m.m <- struct{}{}
}
}
}
以下是sample:
package main
import (
"fmt"
"sync"
"sample/samples"
)
func main() {
m := samples.NewMutex()
var n int
var w sync.WaitGroup
w.Add(10000)
for i := 0; i < 10000; i++ {
go func() {
m.Lock()
n ++
m.Unlock()
w.Done()
}()
}
w.Wait()
fmt.Println(n)
}
欢迎留言沟通交流