Go言語でMutexを使用してデータ読み書きの正確性を確保する方法は何ですか?
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型には、countフィールドの読み書き操作を保護するためにsync.Mutex型のフィールドmuが含まれています。Incrementメソッドは、countを増やすために使用され、Readメソッドはcountの値を読み取るために使用されます。
インクリメントとリードメソッドでは、まずc.mu.Lock()を使用してロックをかけ、メソッドの最後にc.mu.Unlock()を使用してロックを解除します。これにより、コードブロック内で1つのgoroutineしかcountフィールドにアクセスできないことが保証され、データの読み書きの正確性が確保されます。
main関数内で、100個の並行goroutineを起動して、カウンターを増やす操作を行い、最後にカウンターの値を読み取ります。Mutexを使用してロックおよびアンロックを行うため、複数のgoroutineが同時にカウンターを増やす場合でも、データ競合の問題は発生しません。最終的なカウンターの値は100になり、データの読み書きの正確性が確保されました。