0 需求分析
- 在一个读操作远大于写操作的时候,用读写锁
- 读写锁与互斥锁的运行时长相比
- 两个goroutine间的通信,写goroutine写完以后通过channel发一个消息给读goroutine,读goroutine收到以后开启200个并发读
- 两个goroutine间的通信用channel ,channel是阻塞的
1 源代码
package main
import (
"fmt"
"sync"
"time"
)
var (
x = 0
wg sync.WaitGroup
myRwMutex sync.RWMutex
myChannel chan int
)
func myRead() {
defer wg.Done()
for i := 0; i < 100; i++ {
myRwMutex.RLock()
fmt.Println(x)
time.Sleep(time.Millisecond)
myRwMutex.RUnlock()
}
}
func myWrite(myChannel *chan int) {
defer wg.Done()
for i := 0; i < 200; i++ {
myRwMutex.Lock()
x += 1
time.Sleep(time.Millisecond * 5)
myRwMutex.Unlock()
}
(*myChannel) <- 1
}
func main() {
myChannel = make(chan int, 1)
nowTime := time.Now()
wg.Add(3)
go myWrite(&myChannel)
flag, ok := <-myChannel
if !ok || flag != 1 {
fmt.Printf("myChannel中没有取到数据:%v\n", ok)
return
}
fmt.Printf("myChannel中取到数据了:%v\n", flag)
close(myChannel)
go myRead()
go myRead()
wg.Wait()
fmt.Println(time.Now().Sub(nowTime))
}