推荐答案
在 Go 语言中,sync.Mutex
是一种互斥锁,用于保护共享资源,防止多个 goroutine 同时访问。以下是使用 sync.Mutex
实现互斥锁的示例代码:
-- -------------------- ---- ------- ------- ---- ------ - ------ ------- ------- - --- - -------- --- ------ ---------- - ---- ----------- - ------------- ------ -------------- ---------- ------------------------ -------- - ---- ------ - ---- - -- -- - - --- --- - ---- ----------- -- ------------------------ ------------------- ---------- -------- -
在这个示例中,mutex.Lock()
用于锁定共享资源,mutex.Unlock()
用于释放锁。defer
语句确保在函数返回时释放锁,即使发生 panic 也不会导致死锁。
本题详细解读
1. sync.Mutex
的基本概念
sync.Mutex
是 Go 语言标准库中提供的一种互斥锁。它有两个主要方法:
Lock()
:锁定互斥锁。如果锁已经被其他 goroutine 锁定,则当前 goroutine 会阻塞,直到锁被释放。Unlock()
:释放互斥锁。如果锁未被锁定,调用Unlock()
会导致运行时错误。
2. 使用 sync.Mutex
的场景
sync.Mutex
通常用于保护共享资源,防止多个 goroutine 同时访问和修改这些资源,从而避免数据竞争(data race)和不一致性问题。
3. 示例代码解析
- 共享资源:
counter
是一个共享的整型变量,多个 goroutine 会同时对其进行修改。 - 互斥锁:
mutex
是一个sync.Mutex
类型的变量,用于保护counter
。 increment
函数:该函数在修改counter
之前先调用mutex.Lock()
锁定互斥锁,修改完成后调用mutex.Unlock()
释放锁。defer
语句:defer mutex.Unlock()
确保在函数返回时释放锁,即使在函数执行过程中发生 panic 也不会导致死锁。main
函数:启动 10 个 goroutine 并发执行increment
函数,最后等待 1 秒钟以确保所有 goroutine 执行完毕,并输出最终的counter
值。
4. 注意事项
- 死锁:如果在锁定互斥锁后忘记释放锁,或者在释放锁之前发生了 panic,可能会导致死锁。因此,建议使用
defer
语句来确保锁的释放。 - 性能:互斥锁的锁定和释放操作会带来一定的性能开销,因此在设计并发程序时应尽量减少锁的持有时间,避免在高并发场景下成为性能瓶颈。
通过以上示例和解析,你应该能够在 Go 语言中正确使用 sync.Mutex
实现互斥锁,保护共享资源。