golang函数中的锁是如何实现的?
作者:OpenWorld
时间:2024-06-03
来源:互联网
浏览:0
Go语言中的锁实现同步并发代码,防止数据竞争:Mutex:互斥锁,保证同一时间只有一个goroutine获取锁,用于临界区控制。RWMutex:读写锁,允许多个goroutine同时读取数据,但仅一个goroutine同时写入数据,适用于需要频繁读写共享数据的场景。
Go 语言中的锁实现同步并发代码,防止数据竞争:Mutex:互斥锁,保证同一时间只有一个 goroutine 获取锁,用于临界区控制。RWMutex:读写锁,允许多个 goroutine 同时读取数据,但仅一个 goroutine 同时写入数据,适用于需要频繁读写共享数据的场景。

Go 函数中的锁是如何实现的?
在 Go 中,锁主要用于同步并发代码,防止并发访问引起的数据竞争。Go 语言提供了多种类型的锁,每种类型具有不同的特性和使用场景。
sync.Mutex:互斥锁
互斥锁是一种最基本的锁,它保证同一时间只有一个 goroutine 可以获取锁。使用 Mutex 可以实现对临界区的访问控制。
package main
import (
"fmt"
"sync"
)
var counter int
var mutex sync.Mutex
func main() {
var wg sync.WaitGroup
for i := 0; i < 500; i++ {
wg.Add(1)
go func() {
defer wg.Done()
mutex.Lock()
counter++
fmt.Printf("Counter: %d\n", counter)
mutex.Unlock()
}()
}
wg.Wait()
}sync.RWMutex:读写锁
读写锁允许多个 goroutine 同时读取数据,但仅允许一个 goroutine 同时写入数据。这对于需要频繁读写共享数据的场景非常有用。
package main
import (
"fmt"
"sync"
)
type BankAccount struct {
balance int
sync.RWMutex
}
func (b *BankAccount) Deposit(amount int) {
b.Lock()
defer b.Unlock()
b.balance += amount
}
func (b *BankAccount) Withdraw(amount int) {
b.Lock()
defer b.Unlock()
b.balance -= amount
}
func (b *BankAccount) Balance() int {
b.RLock()
defer b.RUnlock()
return b.balance
}
func main() {
var wg sync.WaitGroup
bankAccount := BankAccount{balance: 100}
for i := 0; i < 500; i++ {
wg.Add(1)
go func() {
defer wg.Done()
bankAccount.Deposit(10)
}()
}
for i := 0; i < 500; i++ {
wg.Add(1)
go func() {
defer wg.Done()
bankAccount.Withdraw(10)
}()
}
fmt.Println(bankAccount.Balance())
wg.Wait()
}
作者最新文章
三星 Galaxy A08 渲染图曝光:Helio G99 芯片与 6000mAh 电池配置解析
2026-09-08 17:14
OPPO Find X10 Pro Max 影像规格详解:三颗2亿像素镜头与全焦段8K视频能力
2026-09-08 16:41
PDF转HTML在线转换器怎么选?转换后网页排版怎么查?
2026-09-04 11:02
AE教程书籍挑选指南:零基础、动效与合成方向实战标准
2026-09-02 13:31
教程书籍使用SAI软件Logo要单独授权吗:商标引用与出版合规要点
2026-09-02 11:50
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多
Windows 10
Windows
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式
Windows/macOS/Linux
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















