0
点赞
收藏
分享

微信扫一扫

076-使用通信的方式共享内存

金穗_ec4b 2022-08-26 阅读 99


希望你还能记得住这句话:

“不要使用共享数据的方式进行通信,而应该使用通信的方式来共享数据。”

这一节,我们秉承这一理念,来改写前面的银行账户存款问题。

1. 思路

  • 使用 channel 对控制共享数据。
  • 不要将共享数据暴露出去。

其实第二条就可以使用第一条来实现。我们使用一个函数来维护这个共享数据。假设该函数叫 monitor.

完整的程序如下:

// gopl/sync/transaction/bank_monitor/bank.go

package bank

var deposits = make(chan int)
var balances = make(chan int)

// monitor 管理 balance 变量
func monitor() {
var balance int

// 使用 channel 控制对共享数据的访问
for {
select {
case amount := <-deposits:
balance += amount
case balances <- balance:
}
}
}


func Deposit(amount int) {
deposits <- amount
}

func Balance() int {
return <-balances
}

// 这是一个永远不会停止的 goroutine
func init() {
go

上面的 monitor 函数被称之为监控函数,而 ​​go monitor()​​ 则是监控 goroutine.

2. 总结

  • 掌握如何使用通信的方法来共享数据


举报

相关推荐

0 条评论