package main
import("fmt""math/rand""sync""time")var rwMutex1 sync.RWMutex // 锁只有一把, 2 个属性 r wfuncreadGo(in <-chanint, idx int){
for{
rwMutex1.RLock()// 以读模式加锁
num :=<-in
fmt.Printf("----%dth 读 go程,读出:%d\n", idx, num)
rwMutex1.RUnlock()// 以读模式解锁}}funcwriteGo(out chan<-int, idx int){
for{
// 生成随机数
num := rand.Intn(1000)
rwMutex1.Lock()// 以写模式加锁
fmt.Println(num)
out <- num
fmt.Printf("%dth 写go程,写入:%d\n", idx, num)
time.Sleep(time.Millisecond *300)// 放大实验现象
rwMutex1.Unlock()}}funcmain04(){
// 播种随机数种子
rand.Seed(time.Now().UnixNano())// quit := make(chan bool) // 用于 关闭主go程的channel
ch :=make(chanint)// 用于 数据传递的 channelfor i :=0; i <5; i++{
goreadGo(ch, i+1)}for i :=0; i <5; i++{
gowriteGo(ch, i+1)}for{
fmt.Println("aaa")}}
5.读写锁-relock
package main
import("fmt""math/rand""sync""time")var rwMutex sync.RWMutex // 锁只有一把, 2 个属性 r wvar value int// 定义全局变量,模拟共享数据funcreadGo05(idx int){
for{
rwMutex.RLock()// 以读模式加锁
num := value
fmt.Printf("----%dth 读 go程,读出:%d\n", idx, num)
rwMutex.RUnlock()// 以读模式解锁
time.Sleep(time.Second)}}funcwriteGo05(idx int){
for{
// 生成随机数
num := rand.Intn(1000)
rwMutex.Lock()// 以写模式加锁
value = num
fmt.Printf("%dth 写go程,写入:%d\n", idx, num)
time.Sleep(time.Second *5)// 放大实验现象
rwMutex.Unlock()}}funcmain05(){
// 播种随机数种子
rand.Seed(time.Now().UnixNano())for i :=0; i <5; i++{
// 5 个 读 go 程goreadGo05(i +1)}for i :=0; i <5; i++{
//gowriteGo05(i +1)}for{
}}
6.读写锁-channel
**package main
import("fmt""math/rand""time")// var value06 int // 定义全局变量,模拟共享数据funcreadGo06(in <-chanint, idx int){
for{
num :=<-in // 从 channel 中读取数据
fmt.Printf("----%dth 读 go程,读出:%d\n", idx, num)
time.Sleep(time.Second)}}funcwriteGo06(out chan<-int, idx int){
for{
// 生成随机数
num := rand.Intn(1000)
out <- num // 写入channel
fmt.Printf("%dth 写go程,写入:%d\n", idx, num)
time.Sleep(time.Millisecond *300)// 放大实验现象}}funcmain06(){
// 播种随机数种子
rand.Seed(time.Now().UnixNano())
ch :=make(chanint)for i :=0; i <5; i++{
// 5 个 读 go 程goreadGo06(ch, i+1)}for i :=0; i <5; i++{
//gowriteGo06(ch, i+1)}for{
}}**
7.生产者消费者模型
package main
import("fmt""math/rand""time")funcproducer(out chan<-int, idx int){
for i :=0; i <50; i++{
num := rand.Intn(800)
fmt.Printf("生产者%dth,生产:%d\n", idx, num)
out <- num
}close(out)}funcconsumer(in <-chanint, idx int){
for num :=range in {
fmt.Printf("-----消费者%dth,消费:%d\n", idx, num)}}funcmain07(){
product :=make(chanint)
rand.Seed(time.Now().UnixNano())for i :=0; i <5; i++{
goproducer(product, i+1)// 1 生产者}for i :=0; i <5; i++{
goconsumer(product, i+1)// 3 个消费者}for{
}}
8.生产者消费者条件控制
package main
import("fmt""math/rand""sync""time")var cond sync.Cond // 定义全局条件变量funcproducer08(out chan<-int, idx int){
for{
// 先加锁
cond.L.Lock()// 判断缓冲区是否满forlen(out)==5{
cond.Wait()// 1. 2. 3.}
num := rand.Intn(800)
out <- num
fmt.Printf("生产者%dth,生产:%d\n", idx, num)// 访问公共区结束,并且打印结束,解锁
cond.L.Unlock()// 唤醒阻塞在条件变量上的 消费者
cond.Signal()
time.Sleep(time.Millisecond *200)}}funcconsumer08(in <-chanint, idx int){
for{
// 先加锁
cond.L.Lock()// 判断 缓冲区是否为空forlen(in)==0{
cond.Wait()}
num :=<-in
fmt.Printf("-----消费者%dth,消费:%d\n", idx, num)// 访问公共区结束后,解锁
cond.L.Unlock()// 唤醒 阻塞在条件变量上的 生产者
cond.Signal()
time.Sleep(time.Millisecond *200)}}funcmain(){
product :=make(chanint,5)
rand.Seed(time.Now().UnixNano())
quit :=make(chanbool)// 指定条件变量 使用的锁
cond.L =new(sync.Mutex)// 互斥锁 初值 0 , 未加锁状态for i :=0; i <5; i++{
goproducer08(product, i+1)// 1 生产者}for i :=0; i <5; i++{
goconsumer08(product, i+1)// 3 个消费者}/* for {
runtime.GC()
}*/<-quit
}