在Go語言中,可以使用sync
包中的Mutex
類型來保障數據的讀寫正確性。Mutex
是互斥鎖的意思,它提供了兩個方法Lock
和Unlock
,分別用于加鎖和解鎖。下面是一個示例代碼,演示了如何使用Mutex
來保障數據讀寫的正確性:
package main
import (
"fmt"
"sync"
"time"
)
type Counter struct {
mu sync.Mutex
count int
}
func (c *Counter) Increment() {
c.mu.Lock()
defer c.mu.Unlock()
c.count++
}
func (c *Counter) Read() int {
c.mu.Lock()
defer c.mu.Unlock()
return c.count
}
func main() {
counter := Counter{}
wg := sync.WaitGroup{}
// 啟動多個goroutine并發地對計數器進行增加操作
for i := 0; i < 100; i++ {
wg.Add(1)
go func() {
defer wg.Done()
counter.Increment()
}()
}
wg.Wait()
// 讀取計數器的值
fmt.Println(counter.Read())
}
在上面的代碼中,Counter
類型包含了一個sync.Mutex
類型的字段mu
用于保護count
字段的讀寫操作。Increment
方法用于對count
進行增加操作,而Read
方法用于讀取count
的值。
在Increment
和Read
方法中,首先使用c.mu.Lock()
來加鎖,然后在方法體結束時使用c.mu.Unlock()
來解鎖。這樣就保證了在代碼塊中只有一個goroutine可以訪問count
字段,從而保障了數據的讀寫正確性。
在main
函數中,啟動了100個并發的goroutine對計數器進行增加操作,最后再讀取計數器的值。由于使用了Mutex
進行加鎖和解鎖,所以在多個goroutine并發地對計數器進行增加操作時,不會出現數據競爭的問題。最后輸出的計數器的值為100,表示數據讀寫的正確性得到了保障。