Golang如何使用互斥锁进行 Goroutine 的同步?

互斥锁是 Go 语言中最基本的同步原语,用来保护共享资源,避免多个 Goroutine 同时访问时出现竞争条件。

在 Go 语言中,使用 sync 包中的 Mutex 类型来实现互斥锁。Mutex 提供了两个方法 Lock() 和 Unlock(),用来分别获取和释放锁。在获取锁之前,需要先调用 Lock() 方法,这个方法会阻塞 Goroutine 直到获取到锁为止。在使用完共享资源后,需要调用 Unlock() 方法释放锁。

以下是一个简单的使用互斥锁实现并发安全的计数器的示例代码:

package main

import (
    "fmt"
    "sync"
)

type Counter struct {
    value int
    mutex sync.Mutex
}

func (c *Counter) Inc() {
    c.mutex.Lock()
    c.value++
    c.mutex.Unlock()
}

func (c *Counter) Value() int {
    c.mutex.Lock()
    defer c.mutex.Unlock()
    return c.value
}

func main() {
    var counter Counter

    for i := 0; i < 1000; i++ {
        go func() {
            counter.Inc()
        }()
    }

    // 等待所有 Goroutine 执行完毕
    time.Sleep(time.Second)

    fmt.Println(counter.Value()) // 输出 1000
}

在这个示例代码中,Counter 类型包含一个互斥锁和一个 value 值。Inc() 方法用来对计数器进行加一操作,使用了互斥锁保证了并发安全。Value() 方法用来获取当前计数器的值,由于不会修改 value 值,因此可以使用 defer 关键字来在函数返回之前自动释放锁。