考虑以下代码:
type Cache struct{
cache map[string]*http.Response
AddChannel chan *http.Response
RemoveChannel chan *http.Response
FindChannel chan string
}
func (self *Cache) Run(){
select{
case resp := <-self.AddChannel:
//..code
case resp := <- self.RemoveChannel:
//..code
case find := <- self.FindChannel:
//..code
}
}
在这段代码中,创建了一个缓存,并在一个单独的 goroutine 上调用了 Run 函数。
如果要缓存响应,则通过缓存的AddChannel;
如果要删除响应,则通过 RemoveChannel
如果需要找到响应,则通过FindChannel.
这是一种保护缓存免受竞争条件影响的线程安全方式,还是有可能,例如,相同的响应可以发送到AddChannel和RemoveChannel导致缓存损坏。
我已经阅读了 Go 的内存模型文档,并了解到通过通道发送变量肯定会在接收之前发生,但我有点困惑,如果有多个通道与单个实例进行通信,这是否仍然成立。
对不起,如果我的问题措辞不好,感谢您的帮助。
小怪兽爱吃肉
相关分类