在Go语言中,可以使用互斥锁(Mutex)来保护共享资源,以确保在同一时间只有一个goroutine可以访问该资源。互斥锁是一种同步机制,用于避免并发访问导致的数据竞争和不一致性。
要使用互斥锁,需要导入sync
包,并创建一个sync.Mutex
类型的变量。然后,在需要保护的代码块之前使用Lock()
方法来获取锁,并在代码块执行完毕后使用Unlock()
方法释放锁。这样可以确保在获取锁的时候,其他goroutine无法进入被保护的代码块,直到当前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能够修改共享资源,从而避免了竞态条件。最后,我们打印出最终的计数器值。