共计 893 个字符,预计需要花费 3 分钟才能阅读完成。
在 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,表示数据读写的正确性得到了保障。
丸趣 TV 网 – 提供最优质的资源集合!
正文完