在Golang中,可以使用标准库"sync"中的sync.Mutex
来实现多线程安全的日志记录。以下是一个简单的示例:
package main
import (
"fmt"
"log"
"os"
"sync"
"time"
)
type Logger struct {
mu sync.Mutex
logger *log.Logger
}
func NewLogger(prefix string) *Logger {
return &Logger{
logger: log.New(os.Stdout, prefix, log.LstdFlags),
}
}
func (l *Logger) Log(msg string) {
l.mu.Lock()
defer l.mu.Unlock()
l.logger.Println(msg)
}
func main() {
logger := NewLogger("INFO: ")
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
for i := 0; i < 5; i++ {
logger.Log("Thread 1: Log entry " + fmt.Sprintf("%d", i))
time.Sleep(1 * time.Second)
}
}()
go func() {
defer wg.Done()
for i := 0; i < 5; i++ {
logger.Log("Thread 2: Log entry " + fmt.Sprintf("%d", i))
time.Sleep(1 * time.Second)
}
}()
wg.Wait()
}
在这个示例中,我们创建了一个名为Logger
的结构体,它包含一个sync.Mutex
和一个log.Logger
。我们为Logger
结构体定义了一个Log
方法,该方法在记录日志之前锁定互斥锁,并在完成后解锁。这样可以确保在多个线程中同时调用Log
方法时,日志记录是线程安全的。
在main
函数中,我们创建了一个Logger
实例,并启动了两个goroutine,每个goroutine都会记录5条日志。由于我们在Log
方法中使用了互斥锁,因此这两个goroutine可以安全地同时记录日志,而不会出现竞争条件。