Golang最为让人熟知的并发模型当属CSP并发模型,也就是由goroutine和channel构成的GMP并发模型,具体内容不在赘述了,可以翻回之前的文章查看。在这里,要讲讲Golang的其他并发方式。
Golang不仅可以使用CSP并发模式,还可以使用传统的共享数据的并发模式。
临界区(critical section)
这是传统语言比较常用的的方式,即加锁。加锁使其线程同步,每次只允许一个goroutine进入某个代码块,此代码块区域称之为"临界区(critical section)”。
Golang为*临界区(critical section)*提供的是互斥锁的包和条件变量的包。
互斥锁
就是通常使用的锁,用来让线程串行用的。Golang提供了互斥锁sync.Mutex
和读写互斥锁 sync.RWMutex
,用法极其简单:
var s sync.Mutex
s.Lock()
// 这里的代码就是串行了,吼吼吼。。。
s.Unlock()
Lock和Unlock
sync.Mutex
和sync.RWMutex
的区别
没啥大的区别,只不过sync.RWMutex
更加细腻,