go sync包中的互斥锁Mutex和等待组WaitGroup使用详解

 更新时间:2023年08月02日 11:55:57   作者:移动安全星球  
这篇文章主要为大家介绍了go sync包中的互斥锁Mutex和等待组WaitGroup使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

Go 语言的sync包

Go 语言的 sync 包提供了一些基本的同步原语,如互斥锁(Mutex)和等待组(WaitGroup)。这些原语可以帮助你在多个 Go Routine 之间同步状态。

Mutex

互斥锁是一种同步工具,用于保证多个 Go Routine 在访问共享资源时的互斥性。

创建 Mutex:

var m sync.Mutex

使用 Mutex:

m.Lock()
// 临界区,只有获得锁的 Go Routine 才能访问
m.Unlock()

例如,假设我们有一个计数器## sync 包的使用

Go 语言的 sync 包提供了一些基本的同步原语,如互斥锁(Mutex)和等待组(WaitGroup)。这些原语可以帮助你在多个 Go Routine 之间同步状态。

Mutex

互斥锁是一种同步工具,用于保证多个 Go Routine 在访问共享资源时的互斥性。

创建 Mutex:

var m sync.Mutex

使用 Mutex:

m.Lock()
// 临界区,只有获得锁的 Go Routine 才能访问
m.Unlock()

例如,假设我们有一个计数器,我们希望它能在多个 Go Routine 之间安全地使用:

package main
import (
    "fmt"
    "sync"
    "time"
)
type SafeCounter struct {
    v   map[string]int
    mux sync.Mutex
}
func (c *SafeCounter) Inc(key string) {
    c.mux.Lock()
    c.v[key]++
    c.mux.Unlock()
}
func (c *SafeCounter) Value(key string) int {
    c.mux.Lock()
    defer c.mux.Unlock()
    return c.v[key]
}
func main() {
    c := SafeCounter{v: make(map[string]int)}
    for i := 0; i < 1000; i++ {
        go c.Inc("somekey")
    }
    time.Sleep(time.Second)
    fmt.Println(c.Value("somekey"))
}

在这个例子中,SafeCounter 的每个方法在操作 v 之前都会锁定 Mutex 来确保安全访问。

WaitGroup

WaitGroup 是用于等待一组 Go Routines 完成的结构。

使用 WaitGroup:

var wg sync.WaitGroup

每次一个 Go Routine 启动时,我们调用 wg.Add(1)。每次一个 Go Routine 完成时,我们调用 wg.Done()。我们可以使用 wg.Wait() 来阻塞,直到所有的 Go Routines 完成。

例如,假设我们启动了多个 Go Routine 来完成一些工作,我们希望等待它们全部完成:

package main
import (
    "fmt"
    "sync"
    "time"
)
func worker(id int, wg *sync.WaitGroup) {
    defer wg.Done()
    fmt.Printf("Worker %d starting\n", id)
    time.Sleep(time.Second)
    fmt.Printf("Worker %d done\n", id)
}
func main() {
    var wg sync.WaitGroup
    for i := 1; i <= 5; i++ {
        wg.Add(1)
        go worker(i, &wg)
    }
    wg.Wait()
}

在这个例子中,我们使用 WaitGroup 来等待 5 个 worker Go Routines 完成。

总结

Go 语言的 sync 包提供了互斥锁和等待组等同步原语,它们可以帮助我们在多个 Go Routine 之间同步状态。虽然 Go 语言的并发模型主要是基于 Channels 的,但在某些情况下,使用 sync 包提供的同步原语可能会更加方便或有效。

以上就是go sync包中的互斥锁Mutex和等待组WaitGroup使用详解的详细内容,更多关于go sync包互斥锁等待组的资料请关注脚本之家其它相关文章!

相关文章

  • Golang 中 return 与 defer关键字实践指南

    Golang 中 return 与 defer关键字实践指南

    本文详细介绍了Go语言中return和defer的关键特性,包括它们的执行顺序、在不同场景下的行为,以及defer的其他重要特性,通过具体代码示例,文章帮助读者理解如何正确使用defer,避免常见的陷阱,从而编写出更健壮和易维护的代码,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • Go单元测试对GORM进行Mock测试

    Go单元测试对GORM进行Mock测试

    这篇文章主要为大家介绍了Go单元测试对GORM进行Mock测试用例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Go语言学习之goroutine详解

    Go语言学习之goroutine详解

    Goroutine是建立在线程之上的轻量级的抽象。它允许我们以非常低的代价在同一个地址空间中并行地执行多个函数或者方法,这篇文章主要介绍了Go语言学习之goroutine的相关知识,需要的朋友可以参考下
    2020-02-02
  • go语言中如何使用select的实现示例

    go语言中如何使用select的实现示例

    本文主要介绍了go语言中如何使用select的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • GoLang职责链模式代码实现介绍

    GoLang职责链模式代码实现介绍

    这篇文章主要介绍了GoLang职责链模式代码实现,职责链模式是一种常用的设计模式,可以提高代码的灵活性与可维护性,职责链模式将请求和处理分离,可以让请求在处理链中依次经过多个处理者,直到找到能够处理请求的处理者为止
    2023-05-05
  • Go语言实现简单的一个静态WEB服务器

    Go语言实现简单的一个静态WEB服务器

    这篇文章主要介绍了Go语言实现简单的一个静态WEB服务器,本文给出了实现代码和运行效果,学习Golang的练手作品,需要的朋友可以参考下
    2014-10-10
  • Go微服务网关的实现

    Go微服务网关的实现

    本文主要介绍了Go微服务网关的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Go语言Http Server框架实现一个简单的httpServer

    Go语言Http Server框架实现一个简单的httpServer

    这篇文章主要为大家介绍了Go语言Http Server框架实现一个简单的httpServer抽象,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 浅析go中的map数据结构字典

    浅析go中的map数据结构字典

    golang中的map是一种数据类型,将键与值绑定到一起,底层是用哈希表实现的,可以快速的通过键找到对应的值。这篇文章主要介绍了go中的数据结构字典-map,需要的朋友可以参考下
    2019-11-11
  • 详解Go语言中上下文context的理解与使用

    详解Go语言中上下文context的理解与使用

    在Go的日常开发中,Context上下文对象无处不在,这篇文章小编就来带大家深入了解一下上下文context的理解与使用,文中的示例代码讲解详细,需要的可以参考下
    2023-10-10

最新评论