当前位置: 技术文章>> go中的锁住共享资源详细介绍与代码示例

文章标题:go中的锁住共享资源详细介绍与代码示例
  • 文章分类: 后端
  • 10780 阅读
文章标签: go go基础

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


推荐文章