在Go语言中,互斥锁(Mutex)是一种用于实现互斥访问的同步机制。互斥锁允许只有一个goroutine在同一时间访问共享资源,从而防止多个goroutine同时修改或访问共享资源而引发竞态条件(Race Condition)。
互斥锁可以通过使用sync.Mutex
类型来实现。这个类型提供了两个方法:Lock()
和Unlock()
。当一个goroutine想要访问共享资源时,它首先需要调用Lock()
方法来获取互斥锁。如果其他goroutine已经持有了互斥锁,那么调用Lock()
方法的goroutine将被阻塞,直到持有互斥锁的goroutine调用Unlock()
方法释放互斥锁。一旦互斥锁被获取,那个goroutine就可以访问共享资源。当访问完成后,goroutine需要调用Unlock()
方法来释放互斥锁,这样其他goroutine就可以获取互斥锁并访问共享资源了。
下面是一个使用互斥锁的示例代码:
package main
import ( "fmt" "sync" "time" )
var ( counter int mutex sync.Mutex )
func main() { var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go func() { defer wg.Done() for j := 0; j < 1000; j++ { mutex.Lock() // 获取互斥锁 counter++ // 修改共享资源 mutex.Unlock() // 释放互斥锁 } }() } wg.Wait() // 等待所有goroutine执行完毕 fmt.Println("Final counter:", counter) }
在上面的示例中,我们创建了一个全局变量counter
和一个互斥锁mutex
。然后,我们使用sync.WaitGroup
来等待所有goroutine执行完毕。在每个goroutine中,我们使用一个循环来多次获取互斥锁、修改共享资源(counter)、释放互斥锁。通过使用互斥锁,我们可以确保在同一时间只有一个goroutine能够修改共享资源,从而避免了竞态条件。最后,我们打印出最终的计数器值。