发布于2026-07-13 阅读(0)
扫一扫,手机访问
Golang 中,多线程安全一直是开发者绕不开的话题,尤其在日志记录这种高频访问的场景里。好在标准库的 sync 包提供了简单可靠的方案——sync.Mutex 就能搞定。下面直接看一个典型的实现:

package main
import (
"fmt"
"log"
"os"
"sync"
"time"
)
type Logger struct {
mu sync.Mutex
logger *log.Logger
}
func NewLogger() *Logger {
return &Logger{
logger: log.New(os.Stdout, "", log.LstdFlags),
}
}
func (l *Logger) Log(message string) {
l.mu.Lock()
defer l.mu.Unlock()
l.logger.Println(message)
}
func main() {
logger := NewLogger()
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
logger.Log(fmt.Sprintf("Log message %d from goroutine %d", i, i))
}(i)
}
wg.Wait()
}
这段代码的精髓在于,定义了一个 Logger 结构体,里面装了一把互斥锁 sync.Mutex 和一个标准的 log.Logger。每次调用 Log 方法时,先上锁,再记录,最后解锁——相当于是给日志操作加了一把“安全门”。这样无论多少个 goroutine 并发调用,同一时刻只有一个人能进到日志记录里,数据竞争的问题自然就解决了。
在 main 函数里,我们启动了 10 个 goroutine 并发写日志,然后用 sync.WaitGroup 确保所有 goroutine 都跑完再退出程序。这样一来,既保证了日志不丢失,又避免了乱序冲突。整个模式清晰且可复用,实际项目中你可以根据需求调整日志格式、输出目标,或者换用更细粒度的读写锁来优化性能。
说白了,Golang 的并发安全处理就是这么直接——用好 sync.Mutex,再加个 WaitGroup 协调,日志线程安全的问题就迎刃而解了。当然,这个例子只是基础,如果日志量巨大,还可以考虑用 channel 做缓冲队列,或是改用 sync.RWMutex 来提升并发读效率。但核心原理是一样的:把共享资源的访问串行化。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8