package main
import("fmt""sync""time")var wg sync.WaitGroup //只定义无需赋值var lock sync.RWMutex //读写锁funcread(){defer wg.Done()
lock.RLock()//加读锁 只是读数据,这个锁不产生影响,但是读写同时发生时,会产生影响
fmt.Println("开始读取数据")
time.Sleep(time.Second)
fmt.Println("读取数据成功")
lock.RUnlock()}funcwrite(){defer wg.Done()
lock.Lock()
fmt.Println("开始修改数据")
time.Sleep(time.Second *10)
fmt.Println("修改数据成功")
lock.Unlock()}funcmain(){
wg.Add(6)//启动协程 场合:读多写少for i :=0; i <5; i++{goread()}gowrite()
wg.Wait()}
四 管道
4.1 关闭管道
package main
import"fmt"funcmain(){//定义管道var intChan chanint//通过make初始化:管道可以存放3个int类型的数据
intChan =make(chanint,3)//在管道存放数据
intChan <-10
intChan <-20//关闭管道:close(intChan)//再次写入数据:---->报错//intChan <- 30//当管道关闭后,读取数据是可以的:
num :=<-intChan
fmt.Println(num)}
4.2 遍历管道
package main
import"fmt"funcmain(){
intChan :=make(chanint,100)for i :=0; i <100; i++{
intChan <- i
}//在遍历前,如果没有关闭管道,就会出现deadlock的错误//所以我们在遍历前要进行管道的关闭close(intChan)//遍历 for rangefor v :=range intChan {
fmt.Println(v)}}
4.3 协程和管道协同工作
package main
import("fmt""sync""time")/*
【1】案例需求:
请完成协程和管道协同工作的案例,具体要求:
1) 开启一个writeData协程,向管道中写入50个整数.
2) 开启一个readData协程,从管道中读取writeData写入的数据。
3) 注意: writeData和readDate操作的是同一个管道
4) 主线程需要等待writeData和readDate协程都完成工作才能退出
*/var wg sync.WaitGroup
//写funcwrite(intChan chanint){defer wg.Done()for i :=0; i <50; i++{
intChan <- i
fmt.Println("写入的数据是", i)
time.Sleep(time.Second)}}//读funcread(intChan chanint){defer wg.Done()for v :=range intChan {
fmt.Println("读入的数据是", v)
time.Sleep(time.Second)}}funcmain(){
intChan :=make(chanint,50)
wg.Add(2)gowrite(intChan)goread(intChan)
wg.Wait()}