使用Go当编写高并发应用时,没有避免你写一个系统会有竞态条件(race conditions)。
竞态条件会导致系统难以预料的问题,难以调试,有时更难修复。
所以我们要能写Go程序执行并发以一种安全的方式,而不影响性能。
这就是mutex产生作用的时候。
mutex或者是mutual exclusion是一种机制,允许我们防止并发进入一个数据关键区域,在它已经被一个执行的进程执行。
假设有一个例子,有一个银行账户系统,存款和取款都从这个账户中。
在一个线程中,同步程序,将会是难以置信的简单。
我们可以高效的保证将如期望中工作,通过单元测试。
如果引进了多线程时,在Go的情况是多个goroutines,将会在代码中看到问题。
锁,或者是mutex。是一个异步技术和重要的并发编程概念。
假如你在写一个Go程序,有超过一个线程或者goroutine并发执行。
这些goroutines在之间共享变量,你想要确保一次只有一个goroutine访问变量来避免冲突。
这时可以使用mutexes。
mutex提供资源的互斥,这意味着一次只能有一个goroutine持有它。
任何的goroutine必须先获得mutex,接着访问资源。如果一个goroutine尝试获得一个已经被另一个goroutine持有的mutex,它将被阻塞并且等待mutex被释放。
Go标准库用 sync.Mutex
提供了互斥,和两个方法:
Lock
和 Unlock。
m.Lock(): 锁住mutex m。如果锁已经在使用,调用goroutine阻塞直到mutex可用。
m.Unlock()
: 解锁mutex m。如果m没有已经被锁住,抛出一个运行时错误。