一、Java并发机制的底层实现原理
volatiole应用
volatile的定义与实现原理
java内存模型保证所有线程看到volatile变量是一致的
当前处理器缓存行的数据回写到内存中; 2、回写到内存中的操作会使得其他CPU缓存该内存地址数据无效
缓存一致性协议 MESI
volatile的使用优化
用一种追加字节的方式来优化队列的出队和入队的性能
synchronized的实现与应用
JVM基于进入和退出Monitor对象来实现代码块的同步
java对象头
锁的升级和优化
偏向锁
轻量级锁 -》自旋锁
重量级锁
原子操作的实现原理
处理器如何实现原子操作
总线锁
缓存锁
java如何实现原子操作
通过锁或者循环CAS来实现原子操作
CAS实现原子操作的三大问题
ABA问题: AtomicStampedReference
循环时间开销大
只能保证一个共享变量的原子操作: AtomicReference, 将多个变量放在一个对象进行CAS操作
锁机制
除了偏向锁, JVM实现锁的方式都用了缓存CAS
二、Java内存模型
Java内存模型的基础
并发编程模型的两个关键问题: 线程之间如何通信及线程之间如何异步
Java内存模型的抽象结构
从源代码到指令序列的重排序
并发编程模型的分类
Happens-before
重排序
as-if-serial语义: 不管怎么重排序,程序的执行结果不能被改变(单线程)
程序顺序规则
顺序一致性
数据竞争与顺序一致性
顺序一致性内存模型
同步程序的顺序一致性
未同步程序的执行特性
volatile内存语义
volatile特性
volatile写-读建立 的happens-before关系
volatile 写-读的内存语义
volatile内存语义的实现
锁的内存语义
锁的释放-获取建立的happens-before关系
锁的释放-获取的内存语义
锁内存语义的实现
concurrent包的实现
final域的内存语义
Happens-before
JMM设计
happens-before的定义
happens-before规则
延迟初始化降低初始化类和创建对象的开销
双重检查锁定
基于volatile的解决方案
基于类初始化的解决方案
三、Java并发编程基础
线程
线程的6种状态
Daemon线程
启动或终止线程
线程间通信
volatile和sychronized关键字
等待、通知机制
等待、通知的经典范式
管道输入、输出流
Thread.join()
ThreadLocal
线程应用实例
等待超时模式
一个简单的数据库连接池示例
线程池技术
基于线程池技术的简单web服务器
四、Java中的锁
Lock接口
Lock接口与Synchronized的区别
队列同步器
队列同步器的接口
队列同步器的实现分析
同步队列
独占式同步状态获取的释放
共享式同步状态的获取与释放
独占式超时获取同步状态
重入锁
读写锁
读写锁接口
读写锁的实现分析
读锁的获取与释放
写锁的获取与释放
锁降级
LockSupport工具
Condition工具
Condition接口
Condition的实现分析
等待队列
等待
通知
五、Java并发容器和框架
ConcurrentHashMap
为什么要使用ConcurrentHashMap?
ConcurrentHashMap的结构
ConcurrentHashMap的初始化
定位Segment
ConcurrentHashMap的操作
ConcurrentLinkedQueue
ConcurrentLinkedQueue的结构
入队列
出队列
Java的中的阻塞队列
什么是阻塞队列?
Java里的阻塞队列
阻塞队列的实现原理
Fork/Join框架
什么是Fork/Join框架
工作窃取算法
Fork/Join框架的设计
使用Fork/Join框架
Fork/Join框架的异常处理
Fork/Join的实现原理
六、Java中的13个原子操作类
原子更新基本类型类
原子更新数组
AtomicIntegerArray: 将当前数组复制一份
原子更新引用类型
原子更新字段类
AtomicStampedReference: 原子更新带有版本号的引用类型. 该类将版本号与引用关联起来,可以解决使用CAS进行原子更新时的出现ABA问题
Atomic包一共提供13个类, 基本都是使用Unsafe实现的包装类
七、Java中的并发工具类
CountDownLatch
允许一个或多个线程等待其他线程完成操作
CycliBarrier
让一组线程到达屏障时被阻塞, 直到最后一个线程到达屏障时,屏障才会打开, 所有被屏障拦截的线程才会继续运行
Semaphore
用来控制同时访问特定资源的线程数量, 它通过协调各个线程,以保证合理的使用公共资源
Exchanger
进行线程间的数据交换
CountDownLatch的计数器只能使用一次,不可以被重置, CycliBarrier的计数器可以被重置
八、Executor框架
Executor介绍
Executor框架的两级调度模型
Executor框架的结构和成员
ThreadPoolExecutor
FixedThreadPool
SingleThreadExecutor
CacedThreadPool
ScheduledThredPoolExecutor
ScheduledThredPoolExecutor运行机制
ScheduledThredPoolExecutor实现
FutureTask
FutureTask处理实现Future接口外, 还实现了Runnable接口
FutureTask交给Executor执行, 也可以通过ExecutorService.submit() 或者单独使用FutureTask
FutureTask基于AQS
九、Java并发编程实践
生产者和消费者模式
线上问题定位
top、jstat
jstack 来 dump线程
性能测试
异步线程池
十、Java中的线程池
线程池的实现原理
线程池的使用
线程池的创建
corePoolSize
WorkerQueue
maximumPoolSize
ThreadFacotry
RejectedExecutionHandler
KeepAliveTime
TimeUnit
向线程池提交任务
execute(): 用于提交不需要返回值的任务
submit(): 用于提交需要返回值的任务
关闭线程池
shutdown
ShutdownNow
合理配置线程池
线程池的监控