Java 并发知识

(本书还在编写中,如果有任何的疑问或建议可以邮件反馈)

并发(Concurrency)有两层含义:

  • 宏观层面,并发意味着有事件“同时”发生1,如:网络里的多台机器同时发请求;同一台机器上的多个进程;同一个进程里的多个线程等。
  • 微观层面,并发意味着来自各方的事件会被拆解成最小的执行单元(如请求、操作、指令等),它们会被乱序或部分有序地执行,我们希望不影响最终的结果2

在 Java 里,并发的宏观表现就是多线程3,微观上直接表现的是字节码,除此之外,我们还要站在 JVM 的角度,了解 CPU 指令、内存等因素对字节码执行顺序的影响。

为什么要用并发的方式编程?是因为我们想利用多线程提高程序的执行效率,但随之而来的就是种种正确性问题,并发编程中,我们会在正确性与性能间不断权衡。例如为了提高性能,我们只想在必要的地方加锁(细粒度),但这样可能很难保证程序的正确性;而如果加了粗粒度的锁(最极端就是全局加锁,等于单线程运行),正确性容易保证,但性能差。

并发产生的正确性问题通常也叫线程安全问题,本书的第一部分我们就会讨论线程安全相关的话题,了解它产生的原因,如何避免等。而为了充分利用多线程的优势,我们需要了解锁的性能,线程切换的损耗等知识,提高程序的性能。

不过在日常的编码中,我们不会经常性地直接使用底层的能力,而是用一些已经封装好的工具,如 JUC 库等,所以我们还会谈一谈其中一些库的使用和原理。

本书一方面是个人学习的记录,一方面是尝试对自身知识的提炼。讲述方式会自底向上,内容偏底层原理的理解。希望你在阅读的你有所帮助。

另外,本人水平有限,有理解不正确的地方,欢迎批评指正,我相信相互交流才能让我们彼此有更大的提升。


1

https://web.mit.edu/6.005/www/fa14/classes/17-concurrency/#concurrency 2: https://en.wikipedia.org/wiki/Concurrency_(computer_science) 3: 在一些支持协程的语言(如 Go)中,单线程也可以产生并发,关键是微观上是否有乱序