# 共享变量和锁机制

除了 channel 之外，go 语言还提供了另外一种并发读写变量的方法，那就是传统编程的锁机制。

当多个 goroutine 要并发地读写某个共享变量时，如果不采取额外的处理，会出现竞争条件。 多次执行会出现不同的结果，最经典的问题就是银行转账，我们希望不管如何操作，结果都是预期的。 不管账户上多出了金额，还是少了金额，都是不可以接受的行为。通过加锁，我们可以实现变量的安全读写。

锁会影响并发的性能，因此锁的粒度要尽量小，以减少额外的开销。

我们还会介绍为什么 go 语言要提供两种并发控制机制，以及它们各自适合的使用场景。
