java并发编程

为什么要使用并发编程?

  1. 随着硬件的发展,互联网系统并发量轻松过百万,传统的中间件和数据库已经不能满足需求,成为瓶颈所在。
  2. 很多情况下,服务器的资源使用率并不高,导致资源浪费,比如线上服务器的CPU使用率经常是10%,并发编程可以提高资源使用率。

但是在并发编程里,很多单线程的规则不太适用,就像汽车的用法不适用飞机一样。

在并发编程里,经常遇到很多诡异的bug,这些bug大多可能是逻辑问题或者是对使用的技术不了解导致的。

并发编程的三个核心问题

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

Java SDK 并发包很大部分内容都是按照这三个维度组织的

分工

分工指的是如何高效地拆解任务并分配给线程。

Fork/Join 框架就是一种分工模式

同步

同步指的是线程之间如何协作。

CountDownLatch 就是一种典型的同步方式

互斥

互斥则是保证同一时刻只允许一个线程访问共享资源。

可重入锁则是一种互斥手段。

并发编程Bug的源头

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

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

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

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

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

可见性

可见性:一个线程对共享变量的修改,另外一个线程能够立刻看到。
CPU缓存、内存 数据不一致导致。

原子性

原子性:一个或者多个操作在 CPU 执行的过程中不被中断的特性。
线程切换导致。

有序性

有序性:程序按照代码的先后顺序执行。
重排序导致。

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

并发编程

线程

  1. 线程简介
  2. 线程生命周期
  3. 线程常用操作
  4. 线程同步

并发包

Lock
Condition
Semaphore
ReadWriteLock
StampedLock
ReentrantLock
CountDownLatch
CyclicBarrier
并发容器
Atomic
ExecutorService
Feature
CompletableFeature
CompletionService
ForkJoin
ThreadLocal

References

[1] 简明高效的 Java 并发编程学习指南
[2] Doug Lea并发编程文章全部译文

http://gee.cs.oswego.edu/

https://wiki.sei.cmu.edu/confluence/display/java/2+Rules

https://github.com/Fadezed/concurrency