你好,我是晁岳攀,网名鸟窝。

 

作为一位老程序员,我在清华同方、摩托罗拉、Comcast 等公司,一直使用 Java 做项目开发。但是后来,我毅然抛弃了十几年的 Java 编程经验,投入到了 Go 语言的怀抱,为什么呢?

 

一句话,我被 Go 的简单高效所打动,特别是 Go 在处理并发场景上表现出的独特性能,更是让我着迷。

 

我们知道,Java 语言的编码非常繁琐,为了应用设计模式而做了大量的冗长设计,而 Go 就不一样了。它提供了便利的并发编程方式,简简单单的 Go 语句,就可以创建多个 goroutine 执行并发任务。而且,Go 还提供了独特的 Channel 类型,很容易实现 goroutine 之间的数据交流。所以,Go 并发编程入门很容易,即使是初学者,要写一个使用 goroutine 异步输出 “Hello World” 的例子,也可以不费吹灰之力。

 

可以说,Go 并发编程的重要性不容置疑。只要是使用 Go 开发的大型应用程序,并发是必然要采用的技术。

 

但同时,我也了解到,很多人想要学习 Go 并发编程,却不知道该从何学起。

那学习 Go 并发编程,会遇到哪些困难?
  • 在面对并发难题时,感觉无从下手,不知道该用什么并发原语来解决问题,多个并发原语又不知道哪个是最优解。

  • 不知道如何编排并发任务。并发编程的程序运行存在着很大的不确定性。怎么才能让相应的任务按照你设想的流程运行呢?
  • 用并发方式实现的程序,有时候莫名其妙就 panic 或者死锁了,排查起来非常困难。
  • 已知的并发原语都不能解决并发问题,程序写起来异常复杂,而且代码混乱,容易出错。

 

究竟该如何高效学习 Go 并发编程呢?

 

学习这件事儿,最怕的就是不成体系。所以,我根据逻辑关系,拎出 2 条知识线给你,输出了这张知识地图。

 

Go 并发编程这么难,到底应该怎么学?_Go 并发编程

 

首先,在知识层面,你要全面地了解各种并发编程的技术,并建立起一个丰富的并发原语库,它们就是十八般武器,可以帮助我们灵活地应对各种并发问题。

 

其次,在学习层面,通过 4 步法,让你掌握每种并发原语的实现机制和适用场景。

 

Go 中有个大方向,就是任务编排用 Channel,共享资源保护使用传统并发原语。但实际上,同一场景可能会有多个适用的并发原语,想要选出其中最合适的,就必须弄清楚每种并发原语的适用场景,千万不要被网上的一些文章误导,万事皆用 Channel。

 

而且,你还可以深入学习 Go 并发原语的源代码。你会发现很多独到的设计,比如 Mutex 为了公平性考量的设计、sync.Map 为提升性能做的设计,以及很多并发原语的异常状况的处理方式。尤其是这些异常状况,常常是并发编程中程序 panic 的原因。

 

所以,如果你能深入了解这些并发原语的实现,不但会提高你的编程能力,还能让你避免在开发中踩并发问题的坑。

 

最重要的是,我要带你达到可以独立创造的程度。在面对一些复杂场景时,现有的并发原语是不足已应对的,所以,你要能够创造出自己需要的并发原语。达到了这一层,那就不得了了,可以说你对 Go 并发原语的掌握已经出神入化了。

 

作为 Go 语言的布道者,我想将这些方法与经验系统分享给大家,因此,我与极客时间合作,推出了专栏《Go 并发编程实战课》,希望带你从广度和深度上掌握 Go 并发编程的知识点,彻底吃透并发原语的实现原理及使用技巧。同时,会为你讲解 20+ 大型项目的真实踩坑案例及解决方案,掌握分布式场景中并发问题的应对策略,完美攻克并发编程各类难题。

我是谁?

开始和大家提到了,我是晁岳攀,网名鸟窝。前微博技术专家,微服务框架 rpcx 的作者,先后在摩托罗拉、Comcast 担任开发和管理工作,著有《Scala 集合技术手册》一书。

 

在微博担任研发平台架构中心资深架构师期间,使用 Go 参与开发多个基础架构系统,并负责中国版权链,微博下一代的 Redis 集群系统、数据库资源云等系统的设计和开发,有大量的高并发高吞吐的服务器开发经验。

 

我经常会在博客中发表一些 Go 语言相关的教学文章。曾在 2019 年的 Go 语言线下大会上分享《Go 同步和并发设计模式》,准备了 120 页的 PPT,现场观众都说干货满满,还举办了《深入 Go 并发编程》培训专场。

我是如何讲 Go 并发编程的?

 

专栏整体共分为 5 个模块,分别是基本并发原语、扩展并发原语、原子操作、Channel 和和分布式并发原语。

 

基本并发原语:详细讲解标准库的并发原语,包括互斥锁、读写锁等。

 

扩展并发原语:Go 官方提供的扩展库以及第三方提供的并发原语,包括自旋锁、文件锁等。

 

原子操作:原子操作是并发原语的基础。在这个模块,会具体介绍 Go 标准库提供的原子操作和扩展库,包括原子操作的实现、数据类型、提供的函数等

 

Channel:Go 特有的数据类型,会详细讲解容易出错的场景。

 

分布式并发原语:在分布式编程中常用的并发原语,比如 Leader 选举等。