golang 锁

发布时间:2024-07-05 00:10:45

在Golang中,锁(Lock)是一种重要的同步机制,用于保护共享资源的并发访问。锁允许多个Goroutine访问共享资源时保证数据的一致性和完整性。

1. 什么是锁

锁是Golang中重要的并发原语,用于实现对共享资源的互斥访问。当一个Goroutine想要修改共享资源时,它必须先获得锁,其他Goroutine则需要等待锁的释放。这可以确保在同一时间只有一个Goroutine在修改共享资源,避免了并发访问带来的数据不一致问题。

2. 内置的锁类型

Golang提供了两种常用的锁类型:互斥锁(Mutex)和读写锁(RWMutex)。

互斥锁(Mutex):互斥锁用于保护一个共享资源,在任意时刻只能有一个Goroutine持有该锁,并访问共享资源。当其他Goroutine想要访问共享资源时,它们将被阻塞,直到锁被释放。

读写锁(RWMutex):读写锁允许多个Goroutine同时持有读锁(共享访问),但在写锁(独占访问)被持有时,其他Goroutine无法持有任何锁。这种锁适合对于读操作远远多于写操作的场景,可以提高并发读取性能。

3. 使用锁的示例

Golang的锁类型使用简单,下面是一个使用互斥锁和读写锁的示例:

import "sync"

type Counter struct {
    count int
    mutex sync.Mutex
    rwMutex sync.RWMutex
}

func (c *Counter) Increment() {
    c.mutex.Lock() // 获取互斥锁
    defer c.mutex.Unlock() // 在函数返回前释放锁
    c.count++
}

func (c *Counter) Get() int {
    c.rwMutex.RLock() // 获取读锁
    defer c.rwMutex.RUnlock()
    return c.count
}

func (c *Counter) Set(value int) {
    c.rwMutex.Lock() // 获取写锁
    defer c.rwMutex.Unlock()
    c.count = value
}

在上述示例中,Counter结构体中使用了互斥锁和读写锁。Increment方法使用互斥锁来保护count变量的并发修改,Get方法使用读写锁的读锁来实现并发读取,而Set方法使用读写锁的写锁来实现独占写入。

相关推荐