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())
}
版权声明:本文为qq_36183935原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。