Java并发编程深度解析与实战

Java并发编程深度解析与实战

查阅电子书
手机扫码
  • 微信扫一扫

    关注微信公众号

因版权原因待上架

编辑推荐

本书涵盖Java整个并发程序体系的核心库和核心类,详解大量的设计思想,并与实际案例结合。

内容简介

本书涵盖Java并发编程体系的核心库和核心类的使用及原理分析,具体包括线程、synchronized、volatile、J.U.C中的重入锁和读写锁、并发中的条件等待机制、J.U.C并发工具集、深度探索并发编程不得不知的工具、阻塞队列、并发安全集合、线程池、异步编程特性等。

书中针对每一个技术点,纵向分析与其相关的所有内容,并且对相关知识点进行了非常详细的说明,同时从架构实践的角度来看待并发,通过大量实战案例让读者理解各类技术在实际应用中的使用方法。

作者花费了4年时间,投入了大量精力对并发编程领域进行了深入的研究,将自己13年的Java开发及架构经验融入了书中,对各位读者来说,这应该是一本非常值得阅读的图书。

作者简介

谭锋(Mic)

  咕泡学院联合创始人,2017年开始创业,至今4年多时间。拥有13年Java开发及架构经验,其中有4年授课经验,培养了近3W+学员,学员遍布一二线主流互联网企业。

  曾就职于中国电信、平安支付、挖财等公司担任业务架构师,在平安支付主导基于Dubbo的服务化架构设计和落地,在上海挖财推动基于Spring Boot微服务化架构的改造。

  因此对于微服务架构、高并发架构有非常丰富的实践经验和深度研究。目前担任教学总监一职,负责微服务高并发领域的课程研发和设计。


章节目录

版权信息

内容简介

前言

读者服务

第1章 Java线程的实践及原理揭秘

1.1 如何理解系统并发

1.2 系统如何支撑高并发

1.3 线程的前世今生

1.3.1 大白话理解进程和线程

1.3.2 线程的核心价值

1.3.3 如何理解并发和并行

1.4 在Java中如何使用多线程

1.4.1 实现Runnable接口创建线程

1.4.2 继承Thread类创建线程

1.4.3 实现Callable接口并创建带返回值的线程

1.5 多线程如何应用到实际场景

1.5.1 ServerSocket

1.5.2 SocketThread

1.6 多线程的基本原理

1.7 线程的运行状态

1.7.1 线程运行状态演示

1.7.2 线程运行状态流转图

1.8 如何正确终止线程

1.8.1 关于安全中断线程的思考

1.8.2 安全中断线程之interrupt

1.8.3 如何中断处于阻塞状态下的线程

1.8.4 interrupt()方法的实现原理

1.9 理解上下文切换带来的性能影响

1.9.1 上下文切换带来的问题

1.9.2 什么是上下文切换

1.9.3 如何减少上下文切换

1.10 揭秘守护线程

1.10.1 守护线程的应用场景

1.10.2 守护线程使用注意事项

1.11 快速定位并解决线程导致的生产问题

1.11.1 死锁导致请求无法响应

1.11.2 CPU占用率很高,响应很慢

1.12 本章小结

第2章 深度揭秘synchronized实现原理

2.1 揭秘多线程环境下的原子性问题

2.1.1 深入分析原子性问题的本质

2.1.2 关于原子性问题的解决办法

2.2 Java中的synchronized同步锁

2.2.1 synchronized的使用方法

2.2.2 了解synchronized同步锁的作用范围

2.3 关于synchronized同步锁的思考

2.4 synchronzied同步锁标记存储分析

2.4.1 揭秘Mark Word的存储结构

2.4.2 图解分析对象的实际存储

2.4.3 通过ClassLayout查看对象内存布局

2.4.4 Hotspot虚拟机中对象存储的源码

2.5 synchronized的锁类型

2.5.1 偏向锁的原理分析

2.5.2 轻量级锁的原理分析

2.5.3 重量级锁的原理分析

2.6 关于CAS机制的实现原理分析

2.6.1 CAS在AtomicInteger中的应用

2.6.2 CAS实现自旋锁

2.6.3 CAS在JVM中的实现原理分析

2.7 锁升级的实现流程

2.7.1 偏向锁的实现原理

2.7.2 轻量级锁的实现原理

2.7.3 重量级锁的实现原理

2.8 synchronized使用不当带来的死锁问题

2.8.1 死锁的案例分析

2.8.2 死锁产生的必要条件

2.8.3 如何解决死锁问题

2.9 本章小结

第3章 volatile为什么能解决可见性和有序性问题

3.1 关于线程的可见性问题分析

3.1.1 思考导致问题的原因

3.1.2 volatile关键字解决可见性问题

3.2 深度理解可见性问题的本质

3.2.1 如何最大化提升CPU利用率

3.2.2 详述CPU高速缓存

3.2.3 CPU缓存一致性问题

3.2.4 总结可见性问题的本质

3.3 volatile如何解决可见性问题

3.4 指令重排序导致的可见性问题

3.4.1 什么是指令重排序

3.4.2 as-if-serial语义

3.5 从CPU层面深度剖析指令重排序的本质

3.5.1 CPU优化——Store Buffers

3.5.2 CPU优化——Store Forwarding

3.5.3 CPU优化——Invalidate Queues

3.6 通过内存屏障解决内存系统重排序问题

3.6.1 内存屏障详解

3.6.2 通过内存屏障防止重排序

3.6.3 不同CPU的重排序规则

3.6.4 总结CPU层面的可见性问题

3.7 Java Memory Mode

3.7.1 从JVM和硬件层面理解Java Memory Mode

3.7.2 JVM提供的内存屏障指令

3.8 揭秘volatile实现原理

3.9 Happens-Before模型

3.9.1 程序顺序规则

3.9.2 传递性规则

3.9.3 volatile变量规则

3.9.4 监视器锁规则

3.9.5 start规则

3.9.6 join规则

3.10 本章小结

第4章 深入浅出分析J.U.C中的重入锁和读写锁

4.1 J.U.C中与锁相关的API

4.1.1 ReentrantLock的基本应用

4.1.2 ReentrantReadWriteLock的基本应用

4.1.3 StampedLock的基本应用

4.2 ReentrantLock的设计猜想

4.2.1 锁的互斥,必须要竞争同一个共享变量

4.2.2 没有竞争到锁的线程,需要阻塞

4.2.3 需要一个容器存储被阻塞的线程

4.3 ReentrantLock实现原理分析

4.4 AbstractQueuedSynchronizer

4.5 ReentrantLock源码分析

4.5.1 ReentrantLock.lock()方法

4.5.2 AbstractQueuedSynchronizer.acquire()方法

4.5.3 NonfairSync.tryAcquire()方法

4.5.4 ReentrantLock.nofairTryAcquire()方法

4.5.5 AbstractQueuedSynchronizer.addWaiter()方法

4.5.6 AQS.acquireQueued()方法

4.6 ReentrantLock释放锁源码分析

4.6.1 ReentrantLock.tryRelease()方法

4.6.2 unparkSuccessor()方法

4.6.3 释放锁的线程继续执行

4.7 分析ReentrantReadWriteLock类的原理

4.7.1 WriteLock锁竞争原理

4.7.2 ReadLock锁竞争原理

4.7.3 ReentrantReadWriteLock中的锁降级

4.8 StampedLock的原理分析

4.8.1 核心内部类分析

4.8.2 StampedLock原理图解

4.8.3 StampedLock锁升级

4.9 本章小结

第5章 从线程通信来窥探并发中的条件等待机制

5.1 wait/notify

5.1.1 wait()/notify()方法使用实战

5.1.2 图解生产者/消费者

5.1.3 wait()/notify()方法的原理

5.1.4 wait()/notify()方法为什么要加同步锁

5.2 通过Thread.join获取线程执行结果

5.2.1 Thread.join()方法的执行流程

5.2.2 Thread.join()方法的实现原理

5.3 J.U.C中的条件控制Condition

5.3.1 Condition的基本应用

5.3.2 基于Condition的手写阻塞队列

5.4 Condition的设计猜想

5.5 Condition的源码分析

5.5.1 Condition.await()方法

5.5.2 Condition.signal()方法

5.5.3 锁竞争成功后的执行流程

5.6 本章小结

第6章 J.U.C并发工具集实战及原理分析

6.1 CountDownLatch简单介绍

6.1.1 CountDownLatch的基本使用

6.1.2 CountDownLatch运行流程

6.1.3 如何落地到实际应用

6.1.4 CountDownLatch的其他用法

6.2 CountDownLatch底层原理

6.2.1 让线程等待的await()方法到底做了什么

6.2.2 深入分析countDown()方法源码

6.2.3 线程被唤醒后的执行逻辑

6.3 Semaphore

6.3.1 Semaphore使用案例

6.3.2 Semaphore方法及场景说明

6.4 Semaphore原理分析

6.4.1 Semaphore令牌获取过程分析

6.4.2 Semaphore令牌释放过程分析

6.5 CyclicBarrier

6.5.1 CyclicBarrier的基本使用

6.5.2 基本原理分析

6.6 CyclicBarrier实现原理及源码

6.6.1 await()方法

6.6.2 reset()方法

6.7 本章小结

第7章 深度探索并发编程不得不知的工具

7.1 初步认识ThreadLocal

7.2 ThreadLocal的应用场景分析

7.3 ThreadLocal解决SimpleDateFormat线程安全问题

7.3.1 SimpleDateFormat线程安全问题的原理

7.3.2 ThreadLocal实现线程安全性

7.4 ThreadLocal实现原理分析

7.4.1 set()方法源码分析

7.4.2 get()方法源码分析

7.4.3 ThreadLocal内存泄漏

7.5 任务拆分与聚合Fork/Join

7.5.1 Fork/Join的核心API说明

7.5.2 Fork/Join的基本使用

7.6 Fork/Join的实现原理

7.6.1 WorkQueue的原理

7.6.2 工作窃取算法

7.7 Fork/Join的核心源码分析

7.7.1 任务提交过程详解

7.7.2 唤醒或者创建工作线程

7.7.3 工作线程和工作队列的绑定

7.7.4 ForkJoinWorkerThread运行过程

7.8 使用Fork/Join解决实际问题

7.8.1 项目结构说明

7.8.2 ILoadDataProcessor

7.8.3 AbstractLoadDataProcessor

7.8.4 业务服务类

7.8.5 Item聚合任务服务

7.8.6 ComplexTradeTaskService

7.8.7 测试代码

7.9 本章小结

第8章 深度剖析阻塞队列的设计原理及实现

8.1 什么是阻塞队列

8.2 Java中提供的阻塞队列

8.3 阻塞队列中提供的方法

8.4 阻塞队列的使用

8.4.1 生产者/消费者模型代码

8.4.2 图解阻塞队列实现原理

8.5 阻塞队列应用实战

8.5.1 基于阻塞队列的责任链源码

8.5.2 阻塞队列实战场景总结

8.6 详解J.U.C中阻塞队列的使用

8.6.1 基于数组结构的阻塞队列ArrayBlockingQueue

8.6.2 基于链表的阻塞队列LinkedBlockingQueue

8.6.3 优先级阻塞队列PriorityBlockingQueue

8.6.4 延迟阻塞队列DelayQueue

8.6.5 无存储结构的阻塞队列SynchronousQueue

8.6.6 阻塞队列结合体LinkedTransferQueue

8.6.7 双向阻塞队列LinkedBlockingDeque

8.7 阻塞队列的实现原理

8.7.1 put()方法说明

8.7.2 take()方法说明

8.8 本章小结

第9章 深度解读并发安全集合的原理及源码

9.1 并发安全集合ConcurrentHashMap

9.2 正确理解ConcurrentHashMap的线程安全性

9.2.1 computeIfAbsent()方法详解

9.2.2 computeIfPresent()方法详解

9.2.3 compute()方法详解

9.2.4 merge()方法详解

9.3 ConcurrentHashMap的数据结构

9.3.1 ConcurrentHashMap数据存储相关定义

9.3.2 Node数组初始化过程分析

9.3.3 单节点到链表的转化过程分析

9.3.4 扩容还是转化为红黑树

9.4 深度分析ConcurrentHashMap中的并发扩容机制

9.4.1 多线程并发扩容原理图解

9.4.2 详解ConcurrentHashMap中的数据迁移

9.5 分段锁设计提高统计元素数量的性能

9.5.1 size计数的基本原理分析

9.5.2 addCount()方法详解

9.5.3 fullAddCount()方法分析

9.6 详解红黑树的实现原理

9.6.1 什么是红黑树

9.6.2 红黑树的平衡规则

9.6.3 红黑树的平衡场景规则说明

9.6.4 红黑树插入元素平衡图解

9.6.5 红黑树规则实战解析

9.6.6 红黑树中删除元素的平衡规则

9.7 ConcurrentHashMap中红黑树的使用

9.7.1 TreeBin的基本介绍

9.7.2 链表转化成红黑树

9.7.3 自平衡

9.7.4 ConcurrentHashMap总结

9.8 Java中其他并发安全集合

9.8.1 ConcurrentLinkedQueue

9.8.2 ConcurrentLinkedDeque

9.8.3 ConcurrentSkipListMap

9.9 深度分析数据结构:跳表

9.9.1 什么是跳表

9.9.2 跳表的特性

9.9.3 跳表的基本操作

9.10 本章小结

第10章 站在架构的角度思考线程池的设计及原理

10.1 线程池的优势

10.2 Java中提供的线程池

10.2.1 线程池的使用

10.2.2 ThreadPoolExecutor

10.3 Executor框架详解

10.4 线程池的设计猜想

10.4.1 线程池的需求分析

10.4.2 生产者/消费者模型的设计

10.4.3 任务拒绝策略

10.4.4 非核心线程的回收

10.4.5 线程池设计总结

10.5 从实现原理了解线程池

10.6 线程池核心源码剖析

10.6.1 线程状态和数量存储

10.6.2 线程池的状态机及变更

10.6.3 从execute()方法分析线程池源码

10.7 合理设置线程池参数

10.7.1 线程池大小的合理设置

10.7.2 动态设置线程池参数

10.8 线程池的监控

10.8.1 线程池监控的基本原理

10.8.2 在Spring Boot应用中发布线程池信息

10.9 本章小结

第11章 Java并发编程中的异步编程特性

11.1 了解Future/Callable

11.2 Future/Callable的实现原理

11.2.1 FutureTask的核心属性

11.2.2 FutureTask.run()

11.2.3 FutureTask.get()

11.2.4 finishCompletion()

11.3 Java 8新特性之CompletableFuture

11.3.1 CompletableFuture类关系图

11.3.2 CompletableFuture方法说明

11.3.3 主动获取执行结果

11.4 CompletionStage方法及作用说明

11.4.1 方法分类概述

11.4.2 CompletionStage异常处理方法

11.4.3 方法类型总结

11.5 CompletableFuture综合实战

11.5.1 商品实体对象

11.5.2 模拟微服务请求实现类

11.5.3 Web请求

11.6 CompletableFuture实现原理分析

11.6.1 Completion说明

11.6.2 图解Completion的栈结构

11.7 核心源码分析

11.7.1 CompletableFuture静态任务创建

11.7.2 Completion Stack构建

11.7.3 简述UniCompletion

11.7.4 任务执行流程

11.7.5 获取任务执行结果

11.8 本章小结

Java并发编程深度解析与实战是2021年由电子工业出版社出版,作者谭锋(Mic)。

得书感谢您对《Java并发编程深度解析与实战》关注和支持,如本书内容有不良信息或侵权等情形的,请联系本网站。

购买这本书

你可能喜欢
Python深度学习与项目实战 电子书
本书基于Python以及两个深度学习框架Keras与TensorFlow,讲述深度学习在实际项目中的应用。本书共10章,首先介绍线性回归模型、逻辑回归模型、Softmax多分类器,然后讲述全连接神经网络、神经网络模型的优化、卷积神经网络、循环神经网络,最后讨论自编码模型、对抗生成网络、深度强化学习。
Java编程详解(微课版) 电子书
多年行业积累,让你在边学边练中熟练编写Java代码。
PyTorch深度学习实战 电子书
1.PyTorch核心开发者教你使用PyTorch创建神经网络和深度学习系统的实用指南。2.详细讲解整个深度学习管道的关键实践,包括PyTorch张量API、用Python加载数据、监控训练以及对结果进行可视化。3.PyTorch核心知识+真实、完整的案例项目,快速提升读者动手能力:a.全面掌握PyTorch相关的API的使用方法以及系统掌握深度学习的理论和方法;b.快速从零开始构建一个真实示例:肿瘤图像分类器;c.轻松学会使用PyTorch实现各种神经网络模型来解决具体的深度学习问题;d.章尾附有“练习题”,巩固提升所学知识;更有配套的代码文件可下载并动手实现。4.PyTorch联合创作者SoumithChintala作序推荐!5.书中所有代码都是基于Python3.6及以上的版本编写的,提供源代码下载。
深度学习与飞桨PaddlePaddle Fluid实战 电子书
飞桨PaddlePaddle是百度推出的深度学习框架,不仅支撑了百度公司的很多业务和应用,而且随着其开源过程的推进,在其他行业得到普及和应用。 本书基于2019年7月4日发布的飞桨PaddlePaddle Fluid 1.5版本(后续版本会兼容旧版本),以真实案例介绍如何应用飞桨PaddlePaddle解决主流的深度学习问题。 本书适合对人工智能感兴趣的学生、从事机器学习相关工作的读者阅读,尤其适合想要通过飞桨PaddlePaddle掌握深度学习应用技术的研究者和从业者参考。 本书包括以下内容: ● 飞桨PaddlePaddle 的核心设计思想; ● PaddlePaddle在MNIST上进行手写数字识别; ● 图像分类网络实现案例; ● “天网”中目标检测和像素级物体分割的实现; ● NLP技术应用案例 :word2vec、情感分析、语义角色标注及机器翻译; ● Paddle-Mobile与Anakin框架等高级主题; ● 飞桨PaddlePaddle与TensorFlow、Caffe框架的常用层对比。
Android 源码设计模式解析与实战 电子书
本书适合的读者为初、中、高级Android工程师,也可以作为大专院校相关师生的学习用书和培训学校的教材。