最近学习知识点的时候,包括读《GO 并发编程》的时候,发现频繁被提到的CSP 并发模型
,便花了点时间记一下相关知识点,如有错误,欢迎指出。
Go
实现了两种并发形式。第一种就是大家普遍认知的:多线程共享内存。也就是 Java 或者 C++等语言中的多线程开发。另外一种是 Go语言特有的,
也是 Go
语言推荐的 CSP(Communication sequential processes)并发模型。CSP 讲究的是”以通信的方式来共享内存”。
普通的线程并发,就像是 Java
、C++
,他们线程间通信都是通过共享内存的方式来进行,非常典型的方式就是在访问共享数据时(数组呀、Map、对象啊)的时候,
需要通过锁来访问。当然,Java 也提供了一些线程安全的数据结构,比方说concurrentMap
,Go
语言中也有。
Go 的 CSP 并发模型,是通过goroutine
和channel
来实现的。
goroutine
是Go
语言中并发的执行单位,是一种轻量级的线程。- GO 语言中
goroutine
之间的通信机制,各个goroutine
之间通过channel
来传递信息,使得goroutine
之间解耦。
在通信过程中,传数据channel <- data
和取数据<- channel
一定要成对出现。
channel
是引用类型,所以在他被初始化之前,它的值是nil
,使用make
函数进行初始化,初始化时,可以指定channel
缓冲区的大小,这样就是一个
缓冲型的channel
,不传,构造的就是一个非缓冲型的channel
。对不带缓冲的channel
进行的操作,实际上有点像“同步模式”,而带了缓冲称为“异步模式”。
Goroutine
是实际并发执行的实体,他底层是使用协程coroutine
实现并发,coroutine
是一种运行在用户态的用户线程,它具有以下特点:
- 用户空间,避免了内核态和用户态的切换导致的成本
- 可以由语言和框架进行调度
- 更小的栈空间允许创建大量的实例