并发-传统同步机制

Go学习笔记

在CSP模型下尽量少用传统同步机制,尽量使用chanel进行通信。Go语言中原子操作由内置的标准库sync/atomic提供。

sync.Mutex

互斥量是一种常用的控制共享资源访问的方法,它能够保证同时只有一个goroutine可以访问共享资源。Go语言中使用sync包的Mutex类型来实现互斥量

import (
	"fmt"
	"sync"
	"time"
)

type atomicInt struct {
	value int
	lock  sync.Mutex
}

func (a *atomicInt) increment() {
	fmt.Println("safe increment")
	func() {
		a.lock.Lock()
		defer a.lock.Unlock()

		a.value++
	}()
}

func (a *atomicInt) get() int {
	a.lock.Lock()
	defer a.lock.Unlock()

	return a.value
}

func main() {
	var a atomicInt
	a.increment()
	go func() {
		a.increment()
	}()
	time.Sleep(time.Millisecond)
	fmt.Println(a.get())
}

lock.Lock():加锁

lock.Unlock():解锁

通过运行时查看数据访问冲突

go run -race atomic.go

Go 

See also