Java 并发编程的艺术概要

重读下《Java并发编程的艺术》,根据目录以及自己的学习习惯,重新排序了目录结构,更容易切入。可以根据这些概要更好的复习与回顾。

1.Java 并发编程基础

  • 1.1 理解线程,分别从 什么是线程、为什么要使用多线程、线程优先级、线程的状态、Daemon线程角度来讲述

  • 1.2 启动和终止线程,分别从构造线程、启动、终断和终止角度讲述

  • 1.3 线程间通讯(线程安全),分别从 volatile 和 synchronized 关键字、等待通知、管道输入和输出、Thread.join()、ThreadLocal使用角度讲述

2.Java 中的线程池

  • 2.1 从线程池原理、线程池使用:创建、提交任务、关闭、配置、监控角度来讲述。补充:知道几种常见的线程池,理解参数配置

  • 2.2 流程是提交线程-核心线程池是否已满- 队列是否已满-线程池是否已满-按照策略处理无法执行的任务

  • 2.3 线程池基本参数如:corePoolSize 线程池基本大小-任务队列- ThreadFactory -线程池最大数量-饱和策略

3.Executor 框架

  • 3.1 理解 Executor 接口框架,其成员主要:ThreadPoolExecutor、ScheduledThreadPoolExecutor、Future 接口、Runnable 接口、Callable 接口,工具类 Executors

  • 3.2 ThreadPoolExecutor 详解,上述框架的核心类,分别从 FixedThreadPool、singleThreadExecutor、CachedThreadPool 角度讲述

  • 3.3 理解一个知识点即:FutureTask,异步计算的结果,明白其作用、使用、实现原理

4.Java 并发容器和框架

  • 4.1 要知道 ConcurrentHashMap 出现的原因,实现关键点记住分段锁、Segment 等,另外同类型的要知道ConcurrentLinkedQueue

  • 4.2 知道 Java 中的阻塞队列,阻塞队列实现原理即当队列满了不会让你继续入队,出队同理,典型的阻塞队列如 ArrayBlockingQueue、LinkedBlockingQueue 等

  • 4.3 一个少见的知识点 Fork/Join框架

5.Java 中的并发工具类

  • 5.1 等待多线程完成的 CountDownLatch,允许一个或者多个线程等待其他线程完成操作
  • 5.2 同步屏障 CyclicBarrier ,让一组线程到达一个屏障,直到最后一个线程到达,屏障解除。注意对比 CountDownLatch 的区别
  • 5.3 控制线程并发数的 Semaphore,协调各类线程让其合理的使用公共资源
  • 5.4 线程间交换数据的 Exchanger
  • 5.5 此处补充 wait 和 notify 那一套

6.Java 中的锁

  • 6.1 Lock 接口 其实现原理基本上都是通过聚合了一个 AQS 的子类来完成线程访问控制的

  • 6.2 队列同步器 AQS 是实现锁的关键,其使用一个int 成员变量表示同步状态,通过内置的 FIFO 队列完成资源获取线程的排队工作

  • 6.3 重入锁 ReentrantLock 表示该锁能够支持一个线程对资源的重复加锁

  • 6.4 读写锁 可以同一时间允许多个线程访问,通过分离读锁和写锁,并发性比一般的排他锁有了很大提升

  • 6.5 Condition 接口,理解它的作用,可以更加精细的控制多线程的唤醒与休眠

  • 6.x 这部分一个常见的对比就是 Sync 与 Lock 的区别联系。从中要知道悲观锁与乐观锁的概念、公平锁与非公平锁的概念。

7.Java 并发编程底层实现原理

  • 7.1 volatile 的应用与原理,记住其实现关键字内存屏障,记得要对比 Sync 的区别和联系

  • 7.2 synchronized 的实现原理与应用 ,记住 JVM 基于进入和退出 Monitor 对象来实现方法和代码块同步的 对于普通方法,锁是当前实例对象 对于静态同步方法,锁是当前类的 Class 对象 对于同步方法块,锁是 Sync 括号里配置的对象

  • 7.3 原子操作的实现原理,Java 中实现原子操作是锁和 CAS 操作。CAS 操作面临一个 ABA 和循环时长问题

8.Java 内存模型

  • 8.1 Java 内存模型的基础,关键问题:通信和同步

  • 8.2 重排序 编译器和处理器会对操作进行重排序

  • 8.3 顺序一致性

  • 8.4 volatile 的内存语义

  • 8.5 锁的内存语义

  • 8.6 final 的内存语义 这一点在日常的博客中见的比较少,切入点可能是在多线程如何确保用 final 修饰的常量不会被改变?或者说 final 修饰的变量在一个线程中被赋值,另一个线程中会不会得到同样的数值?

  • 8.7 happens-before,如果一个操作结果需要对另一个操作结果可见,则这两个操作之间必须具备 happens-before 关系

  • 8.8 双重检查锁定与延迟初始化,经典的单利双锁问题

9.Java 中的13个原子操作

  • 原子操作比较容易理解,经典问题类似:i++ 操作是否线程安全?JDK1.5 开始提供 Atomic 包来保证原子操作安全,一共有 13 个操作。

10.Java 并发编程实战

  • 这部分就理解下生产者与消费者、多生产者与多消费者、线程池与生产消费者模式
如果觉得本文对你有帮助,请打赏以回报我的劳动