📜  Golang 中的互斥锁实例(1)

📅  最后修改于: 2023-12-03 15:15:23.217000             🧑  作者: Mango

Golang 中的互斥锁实例

在并发编程中,当多个 goroutine 同时访问共享资源时,可能会导致数据竞态(Data Race)的问题,互斥锁(Mutex)是一种解决并发访问冲突问题的常用工具。本文将介绍 Golang 中互斥锁的使用示例。

互斥锁(Mutex)

互斥锁是 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 中互斥锁的实例介绍,希望对程序员们有所帮助。