チャネル
ゴルーチン間でデータを安全にやり取りするための手段。
データの送受信が同期的に行われるため、データ競合を防ぐことができる。
チャネルはゴルーチンの同期にも使用でき、一つのゴルーチンが結果を計算し、その結果を別のゴルーチンに送信するといった場合に便利である。
→同期処理
ミューテックス
一つのゴルーチンだけが特定のリソース(例えば、共有データ構造)にアクセスできるようにするための手段。
複数のゴルーチンが同時に同じリソースにアクセスしようとしたときのデータ競合を防ぐために使用される。
→排他制御
package main
import (
"fmt"
"sync"
"time"
)
type SafeCounter struct {
v map[string]int
mux sync.Mutex
}
func (c *SafeCounter) Inc(key string, ch chan int) {
c.mux.Lock()
c.v[key]++
c.mux.Unlock()
ch <- c.v[key]
}
func main() {
c := SafeCounter{v: make(map[string]int)}
ch := make(chan int)
for i := 0; i < 1000; i++ {
go c.Inc("somekey", ch)
}
go func() {
for i := range ch {
fmt.Println(i)
}
}()
time.Sleep(time.Second)
close(ch)
}