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

当前位置:

首页 > 编程开发 > 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 可以显著提高并发性能。它支持两种锁: