概述
- sync包下的Cond对象能够帮我们实现并发中对任意对象的值的监听
- 当不满足条件时,我们进行阻塞等待
- 而当条件满足时,我们又能以通知的形式通知等待协程
- 这有点类似并发中的观察者模式
案例说明
- 在下面的例子中,投资者监听比特币的市场行情
- 当行情下跌时,投资者协程阻塞等待等待上涨通知,行情上涨时进行投资
- 市场协程在比特币上涨时通知投资者协程
package main
import (
"fmt"
"sync"
"time"
)
func main() {
//要监听的变量
bitcoinRising := false
//创建条件变量
cond := sync.NewCond(&sync.Mutex{})
/*市场协程*/
go func() {
for {
/*加锁修改为涨,并通知投资者*/
cond.L.Lock()
bitcoinRising = true
cond.Broadcast()
cond.L.Unlock()
//持续涨
time.Sleep(1 * time.Second)
/*加锁修改为跌*/
cond.L.Lock()
bitcoinRising = false
cond.L.Unlock()
//持续一段时间
time.Sleep(3 * time.Second)
}
}()
/*投资者协程*/
for {
/*
加锁阅读比特币的变化
只要比特币跌,就停止投资,等待涨的消息(释放锁)
*/
cond.L.Lock()
for bitcoinRising==false {
fmt.Println("停止比特币投资")
/*
阻塞等待消息
收到涨的消息,就继续向下执行(其它协程通过cond.Signal/Broadcast()发送涨跌消息)
*/
cond.Wait()//内部将锁释放
//收到了市场变化的消息后继续执行
}
//走到这里说明bitcoinRising=true
fmt.Println("开始投资比特币...")
cond.L.Unlock()
}
}