go中正常不经常使用传统同步机制(共享内存来进行通信),常使用channel(通过通信来共享内存)
一、互斥锁
1、不加锁的情况:
type atomicInt int
func (a *atomicInt) increment(){
*a++
}
func (a *atomicInt) get() int {
return int(*a)
}
func main(){
var a atomicInt
a.increment()
go func() {
a.increment()
}()
time.Sleep(5*time.Millisecond)
fmt.Println(a) //可能会冲突,此行在读的时候,increment()可能在写,因为没有加任何锁
}
2、加锁:
type atomicInt struct {
value int
lock sync.Mutex
}
func (a *atomicInt) increment(){
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(5*time.Millisecond)
fmt.Println(a.get())
}