管道channel基本介绍
channel的介绍
- channel的本质就是一个队列,数据先进先出
- 管道是线程安全的,多goroutine访问时,无需加锁
channel基本使用
1 | // 声明 |
注意:
- channel是引用类型(是指针,初始化后才能使用)
- channel是有对应数据类型的
sync包提供了基本的同步基元,如互斥锁。除了Once
和WaitGroup
类型,大部分都是适用于低水平程序线程,高水平的同步使用channel通信更好一些。
1 | type Mutex struct { |
Mutex
是一个互斥锁,可以创建为其他结构体的字段;零值为解锁状态。Mutex
类型的锁和线程无关,可以由不同的线程加锁和解锁。
sync包除了提供互斥锁,还提供了
RWMutex
Cond
WaitGroup
:WaitGroup
对象内部有一个计数器,最初从0开始,它有三个方法:Add(), Done(), Wait()
用来控制计数器的数量。Add(n)
把计数器设置为n
,Done()
每次把计数器-1
,wait()
会阻塞代码的运行,直到计数器地值减为0
Once
(只执行一次动作的对象)一个Go主线程上,可以有多个协程,协程是轻量级线程
主线程一旦退出,其他协程都会被杀死
线程数过多,意味着操作系统会不断地切换线程, 频繁的上下文切换就成了性能瓶颈
Go提供一种机制,可以在线程中自己实现调度,上下文切换更轻量,从而达到了线程数少,而并发数并不少的效果。而线程中调度的就是Goroutine(也就是协程)