📅  最后修改于: 2023-12-03 15:15:23.217000             🧑  作者: Mango
在并发编程中,当多个 goroutine 同时访问共享资源时,可能会导致数据竞态(Data Race)的问题,互斥锁(Mutex)是一种解决并发访问冲突问题的常用工具。本文将介绍 Golang 中互斥锁的使用示例。
互斥锁是 Golang 提供的一种同步原语,用于保护共享资源的访问。在任意时刻,只允许一个 goroutine 持有该锁,其他 goroutine 需要等待锁的释放才能继续访问共享资源。
Golang 中的互斥锁定义在 sync
包中,通过 sync.Mutex
结构体表示。互斥锁的常用方法有两个:
Lock()
:尝试获取锁,如果锁已被其他 goroutine 持有,则阻塞当前 goroutine 直至锁被释放。Unlock()
:释放锁,允许其他 goroutine 获取该锁。下面是一个使用互斥锁的示例程序:
package main
import (
"fmt"
"sync"
"time"
)
// 共享资源
var count int
// 互斥锁
var mutex sync.Mutex
func main() {
// 启动多个 goroutine
for i := 0; i < 5; i++ {
go increment()
}
// 等待所有 goroutine 完成
time.Sleep(time.Second)
fmt.Println("最终结果:", count)
}
func increment() {
for i := 0; i < 10000; i++ {
mutex.Lock() // 获取锁
count++ // 修改共享资源
mutex.Unlock() // 释放锁
}
}
上述程序中,定义了一个共享资源 count
和一个互斥锁 mutex
。在 increment
函数中,通过 Lock()
方法获取锁,然后对共享资源进行修改,最后使用 Unlock()
方法释放锁。这样做可以保证在同时访问 count
时不会发生冲突。
程序启动了多个 goroutine 来并发地对 count
进行修改,最终输出的结果应为 50000
(即 5 * 10000
)。
使用互斥锁可以确保在共享资源的访问过程中只有一个 goroutine 能够操作该资源,从而避免数据竞态问题。互斥锁在 Golang 中是一种常见而且有效的并发编程工具,合理使用互斥锁可以提高程序的并发处理能力。
以上是关于 Golang 中互斥锁的实例介绍,希望对程序员们有所帮助。