一、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 合理配置线程池 线程池的监控