1. golang中安全读写共享变量
-
通过Channel进行安全读写共享变量
-
通过Mutex加锁处理
-
对于Map可以使用sync.Map
-
针对读多写少情况可以使用sync.RWMutex
2. channel是否同步问题
- channel无缓冲时,发送阻塞直到数据被接收,接收阻塞直到读取到数据
- channel有缓冲时,当缓冲满时发送阻塞,当缓冲空时接收阻塞
3. go语言并发机制以及它所使用的CSP并发模型
- CSP模型是上个世纪七十年代提出的,不同于传统的多线程通过共享内存来通信,CSP讲究的是“以通信的方式来共享内存”。用于描述两个独立的并发实体通过共享的通讯 channel(管道)进行通信的并发模型。 CSP中channel是第一类对象,它不关注发送消息的实体,而关注与发送消息时使用的channel。
- Golang中channel 是被单独创建并且可以在进程之间传递,它的通信模式类似于 boss-worker 模式的,一个实体通过将消息发送到channel 中,然后又监听这个 channel 的实体处理,两个实体之间是匿名的,这个就实现实体中间的解耦,其中 channel 是同步的一个消息被发送到 channel 中,最终是一定要被另外的实体消费掉的,在实现原理上其实类似一个阻塞的消息队列。
-
Goroutine 是Golang实际并发执行的实体,它底层是使用协程(coroutine)实现并发,coroutine是一种运行在用户态的用户线程,类似于 greenthread,go底层选择使用coroutine的出发点是因为,它具有以下特点: