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 并发编程实战
- 这部分就理解下生产者与消费者、多生产者与多消费者、线程池与生产消费者模式