展开菜单
首页 精品内容 本月促销 装机必备 Windows macOS软件 IOS软件 Android AI PDF教程 专题
全部分类

当前位置:

首页 > 编程开发 > Golang sync包与互斥锁使用详解

Golang sync包与互斥锁使用详解

Mutex是Go中用于防止数据竞争的互斥锁,通过Lock和Unlock方法确保同一时间只有一个goroutine能访问共享资源,典型用法是配合defer在操作前后加锁和解锁。

Mutex是Go中用于防止数据竞争的互斥锁,通过Lock和Unlock方法确保同一时间只有一个goroutine能访问共享资源,典型用法是配合defer在操作前后加锁和解锁。

Golangsync包并发安全与互斥锁使用

在Go语言中,sync 包是处理并发安全的核心工具之一。当多个goroutine同时访问共享资源时,可能会引发数据竞争(data race),导致程序行为不可预测。为了解决这个问题,Go提供了互斥锁(sync.Mutex)和读写锁(sync.RWMutex)等同步机制,确保同一时间只有一个goroutine能操作关键资源。

什么是Mutex?

sync.Mutex 是一个互斥锁,用于保护共享资源不被多个goroutine同时访问。它有两个主要方法:

  • Lock():获取锁,如果已被其他goroutine持有,则阻塞等待
  • Unlock():释放锁,必须由加锁的goroutine调用,否则会引发panic

典型用法是在操作共享变量前加锁,操作完成后立即解锁,且通常配合 defer 使用,确保即使发生panic也能释放锁。

示例代码:

package main

import (
    "fmt"
    "sync"
)

var (
    counter = 0
    mutex   sync.Mutex
)

func increment(wg *sync.WaitGroup) {
    defer wg.Done()
    mutex.Lock()
    defer mutex.Unlock()
    counter++
}

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go increment(&wg)
    }
    wg.Wait()
    fmt.Println("Counter:", counter) // 输出:Counter: 1000
}

使用RWMutex提升读性能

当共享资源主要是读操作,且写操作较少时,使用 sync.RWMutex 可以显著提高并发性能。它支持两种锁: