20W字详细总结Java并发基础知识

91 阅读4分钟

为什么要用到并发?

一直以来,硬件的发展极其迅速,也有一个很著名的"摩尔定律",可能会奇怪明明讨论的是并发编程为什么会扯到了硬件的发展,这其中的关系应该是多核CPU的发展为并发编程提供的硬件基础。摩尔定律并不是一种自然法则或者是物理定律,它只是基于认为观测数据后,对未来的一种预测。按照所预测的速度,我们的计算能力会按照指数级别的速度增长,不久以后会拥有超强的计算能力,正是在畅想未来的时候,2004年,Intel宣布4GHz芯片的计划推迟到2005年,然后在2004年秋季,Intel宣布彻底取消4GHz的计划,也就是说摩尔定律的有效性超过了半个世纪戛然而止。但是,聪明的硬件工程师并没有停止研发的脚步,他们为了进一步提升计算速度,而不是再追求单独的计算单元,而是将多个计算单元整合到了一起,也就是形成了多核CPU。短短十几年的时间,家用型CPU,比如Intel i7就可以达到4核心甚至8核心。而专业服务器则通常可以达到几个独立的CPU,每一个CPU甚至拥有多达8个以上的内核。因此,摩尔定律似乎在CPU核心扩展上继续得到体验。因此,多核的CPU的背景下,催生了并发编程的趋势,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升。

顶级计算机科学家Donald Ervin Knuth如此评价这种情况:在我看来,这种现象(并发)或多或少是由于硬件设计者无计可施了导致的,他们将摩尔定律的责任推给了软件开发者。

另外,在特殊的业务场景下先天的就适合于并发编程。比如在图像处理领域,一张1024X768像素的图片,包含达到78万6千多个像素。即时将所有的像素遍历一边都需要很长的时间,面对如此复杂的计算量就需要充分利用多核的计算的能力。又比如当我们在网上购物时,为了提升响应速度,需要拆分,减库存,生成订单等等这些操作,就可以进行拆分利用多线程的技术完成。面对复杂业务模型,并行程序会比串行程序更适应业务需求,而并发编程更能吻合这种业务拆分 。正是因为这些优点,使得多线程技术能够得到重视,也是一名学习者应该掌握的:

充分利用多核CPU的计算能力;
方便进行业务拆分,提升应用性能

一直以来并发编程对于刚入行的小白来说总是觉得高深莫测,于是乎,阿里P8级的架构大牛特别整理了一份《并发编程》文档,【+jcc4261获取】帮你精准消除并发编程的技术盲点!

由于篇幅原因,为了不影响阅读,以下是粗略展示

目录:

1. 概览:

  1. 这门课讲什么

  2. 为什么学这么课

  3. 课程特色

  4. 预备知识

2. 进程与线程

  1. 进程与线程

  2. 并行与并发

  3. 应用

3. Java 线程

  1. 创建和运行线程

  2. 观察多个线程同时运行

  3. 查看进程线程的方法

    • 原理之线程运行
  4. 常见方法

  5. start 与 run

  6. sleep 与 yield

  7. join 方法详解

  8. interrupt 方法详解

  9. 不推荐的方法

  10. 主线程与守护线程

  11. 五种状态

  12. 六种状态

![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f1aed5750e394ee8987411dddc978f88~tplv-k3u1fbpfcp-watermark.image?)  

4. 共享模型之管程

  1. 共享带来的问题

  2. synchronized 解决方案

  3. 方法上的 synchronized

  4. 变量的线程安全分析

  5. 习题

  6. Monitor 概念

  7. wait notify wait notify 的正确姿势

  8. Park & Unpark

  9. 重新理解线程状态转换

  10. 多把锁

  11. 活跃性

  12. ReentrantLock

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a7b70fd693794833a49f1f7df383e254~tplv-k3u1fbpfcp-watermark.image?)  

5. 共享模型之内存

  1. ava 内存模型

  2. 可见性

  3. 有序性

6. 共享模型之无锁

  1. 问题提出

  2. CAS 与 volatile

  3. 原子整数

  4. 原子引用

  5. 原子数组

  6. 字段更新器

  7. 原子累加器

  8. Unsafe

7. 共享模型之不可变

  1. 日期转换的问题

  2. 不可变设计

  3. 无状态

8. 共享模型之工具

  1. 线程池

  2. J.U.C