# 致命错误：对未锁定的互斥锁执行解锁操作

- **ID:** `go/mutex-lock-already-held`
- **领域:** go
- **类别:** runtime_error
- **验证级别:** ai_generated
- **修复率:** 85%

## 根因

在同一个协程中对未锁定的 sync.Mutex 调用 Unlock()，或者对同一个互斥锁重复解锁。

## 版本兼容性

| 版本 | 状态 | 引入 | 弃用 |
|------|------|------|------|
| Go 1.18 | active | — | — |
| Go 1.19 | active | — | — |
| Go 1.20 | active | — | — |
| Go 1.21 | active | — | — |
| Go 1.22 | active | — | — |

## 解决方案

1. ```
   始终在同一个函数中配对 Lock() 和 Unlock()，在 Lock() 后立即使用 defer 以避免不匹配
   ```
2. ```
   使用 sync.Mutex.TryLock()（Go 1.18+）在解锁前检查锁是否被持有，但推荐使用结构化模式
   ```

## 无效尝试

- **** — Defer runs even if the lock was never acquired (e.g., due to early return), causing an unlock of an unlocked mutex. (75% 失败率)
- **** — The Go runtime checks that the unlocking goroutine is the same one that locked it; cross-goroutine unlocks panic. (90% 失败率)
