《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》

《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》

目录

第1章 多线程原理与实战

1.2 无处不在的进程和线程

  • 1.2.1 进程的基本原理
  • 1.2.2 线程的基本原理
  • 1.2.3 进程与线程的区别

1.3 创建线程的4种方法

  • 1.3.1 Thread类详解
  • 1.3.2 创建一个空线程
  • 1.3.3 线程创建方法一:继承Thread类创建线程类
  • 1.3.4 线程创建方法二:实现Runnable接口创建线程目标类
  • 1.3.5 优雅创建Runnable线程目标类的两种方式
  • 1.3.6 通过实现Runnable接口的方式创建线程目标类的优缺点
  • 1.3.7 线程创建方法三:使用Callable和FutureTask创建线程
  • 1.3.8 线程创建方法四:通过线程池创建线程

1.4 线程的核心原理

  • 1.4.1 线程的调度与时间片
  • 1.4.2 线程的优先级
  • 1.4.3 线程的生命周期
  • 1.4.4 一个线程状态的简单演示案例
  • 1.4.5 使用Jstack工具查看线程状态

1.5 线程的基本操作

  • 1.5.1 线程名称的设置和获取
  • 1.5.2 线程的sleep操作
  • 1.5.3 线程的interrupt操作
  • 1.5.4 线程的join操作
  • 1.5.5 线程的yield操作
  • 1.5.6 线程的daemon操作
  • 1.5.7线程状态总结

1.6线程池原理与实战

  • 1.6.1 JUC的线程池架构
  • 1.6.2 Executors的4种快捷创建线程池的方法
  • 1.6.3线程池的标准创建方式
  • 1.6.4向线程池提交任务的两种方式
  • 1.6.5线程池的任务调度流程
  • 1.6.6 ThreadFactory (线程工厂)
  • 1.6.7任务阻塞队列
  • 1.6.8调度器的钩子方法
  • 1.6.9线程池的拒绝策略
  • 1.6.10线程池的优雅关闭
  • 1.6.11 Executors快捷创建线程池的潜在问题

1.7确定线程池的线程数

第2章 Java内置锁的核心原理

2.1线程安全问题

  • 2.1.1 自增运算不是线程安全的
  • 2.1.2临界区资源与临界区代码段

2.2 synchronized关键字

  • 2.2.1 synchronized同步方法
  • 2.2.2 synchronized同步块
  • 2.2.3静态的同步方法

2.3生产者-消费者问题

  • 2.3.1生产者-消费者模式
  • 2.3.2一个线程不安全的实现版本
  • 2.3.3一个线程安全的实现版本

2.4 Java对象结构与内置锁

  • 2.4.1 Java对象结构
  • 2.4.2 Mark Word的结构信息
  • 2.4.3使用JOLI具查看对象的布局
  • 2.4.4大小端问题
  • 2.4.5无锁、偏向锁、轻量级锁和重量级锁

2.5偏向锁的原理与实战

  • 2.5.1偏向锁的核心原理
  • 2.5.2偏向锁的演示案例
  • 2.5.3偏向锁的膨胀和撤销

2.6轻量级锁的原理与实战

  • 2.6.1轻量级锁的核心原理
  • 2.6.2轻量级锁的演示案例
  • 2.6.3轻量级锁的分类
  • 2.6.4轻量级锁的膨胀

2.7重量级锁的原理与实战

  • 2.7.1重量级锁的核心原理
  • 2.7.2重量级锁的开销
  • 2.7.3重量级锁的演示案例

2.8偏向锁、轻量级锁与重量级锁的对比

2.9线程间通信

  • 2.9.1线程间通信的定义
  • 2.9.2低效的线程轮询
  • 2.9.3 wait方法和notify方法的原理
  • 2.9.4“等待通知’ 通信模式演示案例
  • 2.9.5生产者-消费者之间的线程间通信
  • 2.9.6需要在synchronized同步块的内部使用wait和notify

第3章 CAS原理与JUC原子类

3.1 什么是CAS

  • 3.1.1 Unsafe类中的CAS方法
  • 3.1.2使用CAS进行无锁编程
  • 3.1.3使用无锁编程实现轻量级安全自增
  • 3.1.4字段偏移量的计算

3.2 JUC原子类

  • 3.2.1 JUC中的Atomic原子操作包
  • 3.2.2基础原子类AtomicInteger
  • 3.2.3数组原子类AtomicIntegerArray
  • 3.2.4 AtomicInteger线程安全原理,

3.3对象操作的原子性

  • 3.3.1引用类型原子类
  • 3.3.2属性更新原子类

3.4 ABA问题

  • 3.4.1了解ABA问题
  • 3.4.2 ABA问题解决方案
  • 3.4.3使用AtomicStampedReference解决ABA问题
  • 3.4.4使用AtomicMarkableReference解决ABA问题

3.5提升高并发场景下CAS操作的性能

  • 3.5.1以空间换时间: LongAdder
  • 3.5.2 LongAdder的原理

3.6 CAS在JDK中的广泛应用

  • 3.6.1 CAS操作的弊端和规避措施

3.6.2 CAS操作在JDK中的应用

第4章 可见性与有序性的原理

4.1 CPU物理缓存结构

4.2并发编程的三大问题

  • 4.2.1原子性问题
  • 4.2.2可见性问题
  • 4.2.3有序性问题

4.3硬件层的MESI协议原理

  • 4.3.1总线锁和缓存锁
  • 4.3.2 MSI协议
  • 4.3.3 MES|协议及RFO请求
  • 4.3.4 volatile的原理

4.4有序性与内存屏障

  • 4.4.1重排序
  • 4.4.2 As-if- -Serial规则
  • 4.4.3硬件层面的内存屏障

4.5 JMM详解

  • 4.5.1什么是Java内存模型
  • 4.5.2 JMM与JVM物理内存的区别
  • 4.5.3 JMM的8个操作
  • 4.5.4 JMM如何解决有序性问题
  • 4.5.5 volatile语义中的内存屏障

4.6 Happens- Before规则

  • 4.6.1 Happens- -Before规则介绍
  • 4.6.2规则1:顺序性规则
  • 4.6.3规则2: volatile规则
  • 4.6.4规则3:传递性规则
  • 4.6.5规则4:监视锁规则.
  • 4.6.6规则5: start()规则
  • 4.6.7规则6: join()规则

4.7 volatile不具备原子性

  • 4.7.1 volatile变量的自增实例
  • 4.7.2 volatile变量的复合操作不具备原子性的原理

第5章 JUC显式锁的原理与实战

5.1显式锁

  • 5.1.1显式锁L _ock接口
  • 5.1.2可重入锁ReentrantL ock
  • 5.1.3使用显式锁的模板代码
  • 5.1.4基于显式锁进行“等待通知”方式的线程间通信
  • 5.1.5 L ockSupport
  • 5.1.6显式锁的分类

5.2悲观锁和乐观锁

  • 5.2.1悲观锁存在的问题
  • 5.2.2通过CAS实现乐观锁
  • 5.2.3不可重入的自旋锁
  • 5.2.4可重入的自旋锁.
  • 5.2.5 CAS可能导致“总线风暴’
  • 5.2.6 CLH自旋锁

5.3公平锁与非公平锁

  • 5.3.1非公平锁实战
  • 5.3.2公平锁实战

5.4可中断锁与不可中断锁

  • 5.4.1锁的可中断抢占
  • 5.4.2死锁的监测与中断

5.5共享锁与独占锁

  • 5.5.1独占锁
  • 5.5.2共享锁Semaphore
  • 5.5.3共享锁CountDownL .atch

5.6读写锁

  • 5.6.1读写锁ReentrantReadWriteL ock
  • 5.6.2锁的升级与降级
  • 5.6.3 StampedL ock

第6章 AQS抽象同步器的核心原理

6.1锁与队列的关系

6.2 AQS的核心成员

  • 6.2.1状态标志位
  • 6.2.2队列节点类
  • 6.2.3 FIFO双向同步队列
  • 6.2.4 JUC显式锁与AQS的关系
  • 6.2.5 ReentrantL ock与AQS的组合关系

6.3 AQS中的模板模式

  • 6.3.1模板模式
  • 6.3.2一个模板模式的参考实现
  • 6.3.3 AQS的模板流程,
  • 6.3.4 AQS中的钩子方法

6.4通过AQS实现一把简单的独占锁

  • 6.4.1简单的独占锁的UML类图
  • 6.4.2简单的独占锁的实现
  • 6.4.3 SimpleMockL ock测试用例

6.5 AQS锁抢占的原理

  • 6.5.1显式锁抢占的总体流程
  • 6.5.2 AQS模板方法: acquire(arg)
  • 6.5.3钩子实现: tryAcquire(arg)
  • 6.5.4直接入队: addWaiter
  • 6.5.5 自旋入队: enq
  • 6.5.6自旋抢占: acquireQueued()
  • 6.5.7挂起预判: shouldParkAfterFailedAcquire()
  • 6.5.8线程挂起: parkAndCheckInterrupt()

6.6 AQS的两个关键点:节点的入队和出队

  • 6.6.1节点的自旋入队
  • 6.6.2节点的出队

6.7 AQS锁释放的原理

  • 6.7.1 SimpleMockL _ock独占锁的释放流程
  • 6.7.2 AQS模板方法: release()
  • 6.7.3钩子实现: tryRelease()
  • 6.7.4唤醒后继: unparkSuccessor()

6.8 ReentrantL ock的抢锁流程

  • 6.8.1 ReentrantL ock非公平锁的抢占流程
  • 6.8.2非公平锁的同步器子类
  • 6.8.3非公平抢占的钩子方法: tryAcquire(arg)
  • 6.8.4 ReentrantL ock公平锁的抢占流程
  • 6.8.5公平锁的同步器子类
  • 6.8.6公平抢占的钩子方法: tryAcquire(arg)
  • 6.8.7是否有后继节点的判断

6.9 AQS条件队列

  • 6.9.1 Condition基本原理
  • 6.9.2 await()等待方法原理
  • 6.9.3 signal()唤醒方法原理,

6.10 AQS的实际应用

第7章 JUC容器类

7.1线程安全的同步容器类

7.2 JUC高并发容器

7.3 CopyOnWriteArrayList

  • 7.3.1 CopyOnWriteArrayList的使用
  • 7.3.2 CopyOnWriteArrayList的原理
  • 7.3.3 CopyOnWriteArrayL ist读取操作
  • 7.3.4 CopyOnWriteArrayList写入操作
  • 7.3.5 CopyOnWriteArrayList的迭代器实现

7.4 BlockingQueue

  • 7.4.1 BlockingQueue的特点
  • 7.4.2阻塞队列的常用方法
  • 7.4.3常见的BlockingQueue
  • 7.4.4 ArrayBlockingQueue的基本使用
    1. 4.5 ArrayBlockingQueue构造器和成员
  • 7.4.6非阻塞式添加元素: add()、 offer()方 法的原理
  • 7.4.7阻塞式添加元素: put()方 法的原理
  • 7.4.8非阻塞式删除元素: pol()方法的原理
  • 7.4.9阻塞式删除元素: take()方 法的原理
  • 7.4.10 peek()直接返回当前队列的头元素

7.5 ConcurrentHashMap

  • 7.5.1 HashMap和HashTable的问题
  • 7.5.2 JDK 1.7版本ConcurrentHashMap的结构
  • 7.5.3 JDK 1.7版本ConcurrentHashMap的核心原理
  • 7.5.4 JDK 1.8版本ConcurrentHashMap的结构
  • 7.5.5 JDK 1.8版本ConcurrentHashMap的核心原理
  • 7.5.6 JDK 1.8版本ConcurrentHashMap的核心源码

第8章 高并发设计模式

8.1线程安全的单例模式

  • 8.1.1从饿汉式单例到懒汉式单例
  • 8.1.2使用内置锁保护懒汉式单例
  • 8.1.3双重检查锁单例模式
  • 8.1.4使用双重检查锁+volatile
  • 8.1.5使用静态内部类实现懒汉式单例模式

8.2 Master-Worker模式

  • 8.2.3 Nginx中Master- Worker模 式的实现
  • 8.2.2 Netty中Master- -Worker模式的实现
  • 8.2.1 Master-Worker模式的参考实现

8.3 ForkJoin模式

  • 8.3.1 ForkJoin模式的原理
  • 8.3.2 ForkJoin框架
  • 8.3.3 ForkJoin框架使用实战
  • 8.3.4 ForkJoin框架的核心API
  • 8.3.5工作窃取算法
  • 8.3.6 ForkJoin框 架的原理

8.4生产者-消费者模式

8.5 Future模式

第9章 高并发核心模式之异步回调模式

9.1从泡茶的案例讲起

9.2 join:异步阻塞之闷葫芦

  • 9.2.1线程的合并流程
  • 9.2.2调用join()实现异步泡茶喝
  • 9.2.3 join()方法详解;

9.3 FutureTask:异步调用之重武器

  • 9.3.1通过Future Task获取异步执行结果的步骤
  • 9.3.2使用FutureTask实现异步泡茶喝

9.4异步回调与主动调用

9.5 Guava的异步回调模式

  • 9.5.1详解FutureCallback
  • 9.5.2详解L istenableFuture
  • 9.5.3 ListenableFuture异步任务
  • 9.5.4使用Guava实现泡茶喝的实例
  • 9.5.5 Guava异步回调和Java异步调用的区别

9.6 Netty的异步回调模式

  • 9.6.1 GenericFuturel istener接口详解
  • 9.6.2 Netty的Future接口详解
  • 9.6.3 ChannelFuture的使用
  • 9.6.4 Netty的出站和入站异步回调

9.7异步回调模式小结

第10章 CompletableFuture异步回调

10.1 CompletableFuture详解

  • 10.1.1 CompletableFuture的UML类关系
  • 10.1.2 CompletionStage接口
  • 10.1.3使用runAsync和supplyAsync创建子任务
  • 10.1.4设置子任务回调钩子
  • 10.1.5调用handle()方法统- -处理异常和结果
  • 10.1.6线程池的使用

10.2异步任务的串行执行

  • 10.2.1 thenApply()方法
  • 10.2.2 thenRun()方法
  • 10.2.3 thenAccept()方法
  • 10.2. 4 thenCompose()方法
  • 10.2.5 4个任务串行方法的区别

10.3异步任务的合并执行

  • 10.3.1 thenCombine()方法
  • 10.3.2 runAfterBoth()方法
  • 10.3.3 thenAcceptBoth()方法
  • 10.3.4 allOf()等待所有的任务结束

10.4异步任务的选择执行

  • 10.4.1 applyToEither()方法
  • 10.4.2 runAfterEither()方法
  • 10.4.3 acceptEither()方法

10.5 CompletableFuture的综合案例

  • 10.5.1 1EFCompletableFuture实现泡茶喝实例
  • 10.5.2 15 FCompletableFuture进行多个RPC调用
  • 10.5.3使用RxJava模拟RPC异步回调

参考资料

  • 《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值