在 golang 中,锁和通道用于解决并发问题。锁(mutex 和 rwmutex)通过阻止多个 goroutine 同时访问共享资源来确保数据完整性。通道允许 goroutine 之间安全地发送和接收数据,并支持同步和顺序性。例如,可以使用锁和通道来实现并发计数器,其中一个 goroutine 递增计数器,另一个 goroutine 打印计数器,确保数据的准确性和顺序性。
GoLang 并发编程中的锁和通道
在 GoLang 中,锁和通道是实现并发编程的关键机制。它们可以帮助我们解决并发环境中常见的同步和通信问题。
锁
立即学习“go语言免费学习笔记(深入)”;
锁通过阻止多个 goroutine 同时访问共享资源来确保数据完整性。有两种常见的锁:
- 互斥锁(Mutex):一次只允许一个 goroutine 访问共享资源。
- 读写锁(RWMutex):多个 goroutine 可以同时读取共享资源,但一次只能有一个 goroutine 写入。
通道
通道是一种在 goroutine 之间安全发送和接收数据的机制。在通道的一端发送值,在另一端接收值。通道支持同步并确保数据传输的顺序性。
实战案例:并发访问计数器
下面是一个使用锁和通道来并发访问计数器的示例:
import ( "sync" ) var ( count int mu sync.Mutex done chan bool ) func main() { go incrementCount(done) go printCount(done) <-done } func incrementCount(done chan bool) { for i := 0; i < 1000; i++ { mu.Lock() count++ mu.Unlock() } done <- true } func printCount(done chan bool) { for { select { case <-done: return default: mu.Lock() println(count) mu.Unlock() } } }
在这个示例中:
- count 是一个共享的计数器变量,由两个 goroutine 同时访问。
- mu 是一个互斥锁,用于保护 count 变量。
- done 是一个通道,用于向主 goroutine 信号所有 goroutine 完成操作。
函数 incrementCount 使用锁来确保 count 每次只被一个 goroutine 递增。函数 printCount 使用通道和 select 语句来同步输出,只在收到 done 信号时才退出。