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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q1007729991/article/details/81610946

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

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

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

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()
}

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

2. 总结

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

猜你喜欢

转载自blog.csdn.net/q1007729991/article/details/81610946
今日推荐