在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可以安全地同時記錄日志,而不會出現競爭條件。