阅读量:0
在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,表示数据读写的正确性得到了保障。