当前位置: 技术文章>> go中的互斥锁详细介绍与代码示例

文章标题:go中的互斥锁详细介绍与代码示例
  • 文章分类: 后端
  • 10785 阅读
文章标签: go go基础

在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能够修改共享资源,从而避免了竞态条件。最后,我们打印出最终的计数器值。


推荐文章