java并发编程

并发编程最早的应用领域就是操作系统的实现。

随着硬件的发展,互联网系统并发量轻松过百万,传统的中间件和数据库已经不能满足需求,成为瓶颈所在。

Java 里 synchronized、wait()/notify() 相关的知识很琐碎,看懂难,会用更难。但实际上 synchronized、wait()、notify() 不过是操作系统领域里管程模型的一种实现而已,Java SDK 并发包里的条件变量 Condition 也是管程里的概念,synchronized、wait()/notify()、条件变量这些知识如果单独理解,自然是管中窥豹。但是如果站在管程这个理论模型的高度,你就会发现这些知识原来这么简单,同时用起来也就得心应手了。管程作为一种解决并发问题的模型,是继信号量模型之后的一项重大创新,它与信号量在逻辑上是等价的(可以用管程实现信号量,也可以用信号量实现管程),但是相比之下管程更易用。而且,很多编程语言都支持管程,搞懂管程,对学习其他很多语言的并发编程有很大帮助。然而,很多人急于学习 Java 并发编程技术,却忽略了技术背后的理论和模型,而理论和模型却往往比具体的技术更为重要。

Java SDK 并发包乃是并发大师 Doug Lea 出品,堪称经典,它内部一定是有章可循的。

并发编程可以总结为三个核心问题:分工、同步、互斥。

分工指的是如何高效地拆解任务并分配给线程,而同步指的是线程之间如何协作,互斥则是保证同一时刻只允许一个线程访问共享资源。Java SDK 并发包很大部分内容都是按照这三个维度组织的,例如 Fork/Join 框架就是一种分工模式,CountDownLatch 就是一种典型的同步方式,而可重入锁则是一种互斥手段。

当把并发编程核心的问题搞清楚,再回过头来看 Java SDK 并发包,你会感觉豁然开朗,它不过是针对并发问题开发出来的工具而已,此时的 SDK 并发包可以任你“盘”了。

并发编程涉及操作系统、CPU、内存等等多方面的知识。

问题背后的本质、问题的起源,同时站在理论、模型的角度讲解 Java 并发,让你的知识更成体系,融会贯通。

要理解可见性,就需要了解一些 CPU 和缓存的知识;要理解原子性,就需要理解一些操作系统的知识;很多无锁算法的实现往往也需要理解 CPU 缓存。

可见性:一个线程对共享变量的修改,另外一个线程能够立刻看到。
CPU缓存、内存 数据不一致导致。
原子性:一个或者多个操作在 CPU 执行的过程中不被中断的特性。
线程切换导致。
有序性:程序按照代码的先后顺序执行。
重排序导致。

References

[0] 为什么需要学习并发编程
[0] 学习攻略 | 如何才能学好并发编程?

[1] 01 | 可见性、原子性和有序性问题:并发编程Bug的源头
[2] 02 | Java内存模型:看Java如何解决可见性和有序性问题
[3] 03 | 互斥锁(上):解决原子性问题
[4] 04 | 互斥锁(下):如何用一把锁保护多个资源?
[5] 05 | 一不小心就死锁了,怎么办?
[6] 06 | 用“等待-通知”机制优化循环等待
[7] 07 | 安全性、活跃性以及性能问题
[8] 08 | 管程:并发编程的万能钥匙
[9] 09 | Java线程(上):Java线程的生命周期
[10] 10 | Java线程(中):创建多少线程才是合适的?
[11] 11 | Java线程(下):为什么局部变量是线程安全的?
[]
[]
[]