这是我参与「第五届青训营 」笔记创作活动的第4天
前言
学习Go语言也快有一个月了,也算对go语言有一点初步了解了。在go语言的学习中也可以横向对比,更加能够体会到go语言的特点。Go语言在并发编程上十分有优势,本文对Go语言的并发编程进行了简要介绍。
并发编程
goroutine
- 并发编程是Go的一大优势之一。当我们需要开启一个多线程时,Java语言由于new Thread()会消耗更多的资源,通常会使用线程池来完成相关多线程的需求。而如何合适的配置线程池也是一个需要慎重考虑的事情。
- Go语言里面的goroutine实现在内核态,一个线程可以跑多个协程,其栈为KB级别。而线程的栈则有MB级别。这意味着goroutine的资源消耗相比线程小了许多。我们可以很轻松的进行一个多线程任务。
- 通常来讲,Go语言时是不必要维护线程池的。但是如果追求极致的性能或者频繁的对协程进行创建和销毁,也是可以考虑使用线程池的。
- 开启一个协程只需要一个go关键字,十分简单。
func helloGoroutine() {
for i := 0; i < 5; i++ {
go func(j int) {
hello(j)
}(i)
}
time.Sleep(time.Second)
}
channel
Go语言提倡通信共享内存,而不是共享内存而实现通信。其相对应的channel创建时可分为有缓冲的和无缓冲的。我认为这种方式可以进一步减少资源的消耗,实现更高的性能。
result := make(chan string)//无缓冲channel
result := make(chan string,3)//有缓冲channel
并发安全
sync.Mutex是Go语言的通用的锁,在会产生并发操作的代码前后添加Lock()和Unlock()可以实现并发安全。
wiatGroup为计数器功能。其add(delta int),Done(),Wait()分别为计数器加delta,计数器减1,主协程阻塞直到计数器为0的功能。用于协程间的同步阻塞。
思考与总结
用Go语言来实现多线程,其性能比较高并且编写起来也比较容易。我已经深深的爱上了Go语言的这种多线程编码方式。希望在继续学习Go语言的过程中,能体会到更多的乐趣。