2 Concurrency Control, Mutexes And Channels

Mutexes

var sum int
var sumLock sync.Mutex
func worker() {
	for i := 0; i < 100; i++ {
		// locks while read/write data
		sumLock.Lock()
		new_val := sum + 1
		sum = new_val
		// unlocks when finished
		sumLock.Unlock()
	}
}

Channels

A way for different goroutines to exchange data

sending value into channel

chan <- val

receiving value from channel

var <- chan
func worker(sumChan chan int) {
	privSum := 0
	for i := 0; i < 100; i++ {
		new_val := privSum + 1
		privSum = new_val
	}
	// sending value into channel
	sumChan <- privSum
}
func main() {
	sumChan = make(chan int)
	for i:=0; i < 100; i++ {
		go worker(sumChan)
	}
	sum := 0
	for i:=0; i < 100; i++ {
		// receiving value from channel
		sum += <- sumChan
	}
	fmt.Println(“sum: %v”, sum)
}

Buffered v.s. Unbuffered Channel

  • If unbuffered, will not accept another send until the existing one is received
ch := make(chan int)
  • allow N sends on the channel without blocking, until the buffer is full
ch := make(chan int, 3)