Skip to content

为什么并发编程这么难以学习?

相信有不少人有这样的感觉,工作几年后很多技术突飞猛进,却只有并发编程成为瓶颈,虽然对并发的类库大部分也都听说过,但还是无法独立写出正确,高效的并发相关的程序,笔者一直在思考为什么会出现这样的问题。

  1. 并发编程涉及到计算机的知识面非常广,数据结构,计算机组成原理,内存、操作系统,JVM,CPU等都需要一定的了解;
  2. 如果要了解底层的实现原理,必然要阅读一些C/C++代码,这对大部分Java程序员也是不友好的;
  3. 在缺乏知识体系的情况下,很多概念理解起来会非常抽象和难以理解,例如 happen-before;
  4. 对JSR的不了解,导致不理解有些概念是怎么来的,例如volatile关键字的作用;
  5. 网上的资料虽然很多,但缺少从全局的角度介绍某些概念的来源。例如,Java 里 synchronized、wait()/notify() 相关的知识很琐碎,看懂难,会用更难。但实际上 synchronized、wait()、notify() 不过是操作系统领域里管程模型的一种实现而已,Java SDK 并发包里的条件变量 Condition 也是管程里的概念,synchronized、wait()/notify()、条件变量这些知识如果单独理解,自然是管中窥豹。但是如果站在管程这个理论模型的高度,你就会发现这些知识原来这么简单,同时用起来也就得心应手了。

笔者试着从更加宏观的角度去讲解清楚并发编程的主线,希望对各位读者有所帮助。

如何学习并发编程

跳出来,看全景,钻进去,看本质

我们先说“跳出来”。你应该也知道,学习最忌讳的就是“盲人摸象”,只看到局部,而没有看到全局。所以,你需要从一个个单一的知识和技术中“跳出来”,高屋建瓴地看并发编程。当然,这首要之事就是你建立起一张全景图

但是光跳出来还不够,还需要下一步,就是在某个问题上钻进去,深入理解,找到本质。对知识点不是浅尝辄止,知其然知其所以然,才算真的学明白了。

并发编程的核心问题

在我看来,并发编程领域可以抽象成三个核心问题:分工、同步和互斥

分工指的是:将大的问题拆分成互不相干的子问题

同步指的是:线程与线程之间存在依赖关系

互斥指的是:对共享资源访问的顺序

你会发现所有并发编程中的概念、关键字、工具类都是围绕这三个方面展开的。

Released under the MIT License.