Java并发编程之美

简介: 并发编程相比 Java 中其他知识点的学习门槛较高,从而导致很多人望而却步。但无论是职场面试,还是高并发/ 高流量系统的实现,却都离不开并发编程,于是能够真正掌握并发编程的人成为了市场迫切需求的人才。

一、内容简介

并发编程相比 Java 中其他知识点的学习门槛较高,从而导致很多人望而却步。但无论是职场面试,还是高并发/ 高流量系统的实现,却都离不开并发编程,于是能够真正掌握并发编程的人成为了市场迫切需求的人才。

《Java并发编程之美》通过图文结合、通俗易懂的讲解方式帮助大家完成多线程并发编程从入门到实践的飞跃!《Java并发编程之美》分为三部分,第一部分为Java 并发编程基础篇,主要讲解Java 并发编程的基础知识、线程有关的知识和并发编程中的其他相关概念,这些知识在高级篇都会有所使用,掌握了本篇的内容,就为学习高级篇奠定了基础;第二部分为Java 并发编程高级篇,讲解了Java 并发包中核心组件的实现原理,让读者知其然,也知其所以然,熟练掌握本篇内容,对我们在日常开发高并发、高流量的系统时会大有裨益;第三部分为Java 并发编程实践篇,主要讲解并发组件的使用方法,以及在使用过程中容易遇到的问题和解决方法。

《Java并发编程之美》适合Java 初级、中高级研发工程师,对Java 并发编程感兴趣,以及希望探究JUC 包源码原理的人员阅读。

预售链接: https://item.jd.com/12450812.html

二、精彩书评

Java的并发编程太重要,又太迷人,所以自Goetz的Java Concurrency in Practice在2006年出版,2012年重译以来,国内的众多作者又陆陆续续出版了若干本相关主题的书籍。那我手上的这本,是又一本Java并发编程(Yet Another )吗?为了找一个大家再次购买的理由,我快速翻完了全书。

显而易见,作者是一位喜欢用代码说话的同学,第1部分基础知识中的每个知识点都伴随一段简短的示例及证明的代码,代码不撒谎。

作者对代码的爱,也带到了第二部分。书中针对Java并发库中的主要组件,进行了代码级的原理讲解,而且紧贴时代脉搏,涵盖了JDK 8的内容。如果你能耐下心来,跟随作者进行一番代码级的探究,所产生的印象比阅读文章、死记结论,无疑要深刻得多。

到了最后的实践部分,依然没有模式、架构之类的宏大叙事,而是作者自己一个个的实践例子。

所以,如果要简单概括,这就是一本有好奇心的Coder,写给另一位有好奇心的Coder的Java并发编程书。

——肖桦(江南白衣),唯品会资深架构师,公众号“春天的旁边”

JDK 1.5之前,我们必须自己编写代码实现一些并发编程的逻辑;之后到了JDK 1.5,Doug Lea解救了广大Java用户,在JDK里特意设计并实现了一套JUC的框架,给大家提供了非常好的并发编程体验。本书作者在阿里经历过大量并发的场景,积攒了不少并发编程的经验,并毫无保留地写入本书。通过书中对JUC源码的解读,读者可以揭开JUC的神秘面纱。这是一本值得仔细品读的好书。

——你假笨/寒泉子,PerfMa CEO,公众号“你假笨”

Java 并发编程所涉及的知识点比较多,多线程编程所考虑的场景相对比较复杂,包括线程间的资源共享、竞争、死锁等问题。并发编程相比 Java 中其他知识点,学习起来门槛相对较高,学习难度较大,从而导致很多人望而却步。加多的《Java并发编程之美》这本书刚好填补了这个空缺,作者在并发编程领域深耕多年。本书用浅显易懂的文字为大家系统地介绍了 Java 并发编程的相关内容,推荐大家关注学习。

——纯洁的微笑,第三方支付公司技术总监,公众号“纯洁的微笑”

Java并发编程无处不在,Java多线程、并发处理是深入学习Java必须要掌握的技术。本书涵盖了Java并发包中的核心类、API以及框架等内容,并辅以详尽的案例讲解,帮助读者快速学习、迅速掌握。如果你希望成长为一名优秀的Java程序员,有必要读一读本书。

——许令波,《深入分析Java Web技术内幕》作者

第1作者加多是一位非常勤奋的技术人员,经常发布各种技术文章,有时候甚至能做到每天一篇,在并发编程网已经累计发布了近百篇文章。本书是他多年的积累,厚积薄发,从并发编程的基础知识一直到实战娓娓道来,希望读者喜欢。

——方腾飞,并发编程网创始人

预售链接: https://item.jd.com/12450812.html

三、 目录

第一部分 Java 并发编程基础篇

第1 章 并发编程线程基础 2

1.1 什么是线程 2

1.2 线程创建与运行 3

1.3 线程通知与等待 6

1.4 等待线程执行终止的join 方法 16

1.5 让线程睡眠的sleep 方法 19

1.6 让出CPU 执行权的yield 方法 23

1.7 线程中断 24

1.8 理解线程上下文切换 30

1.9 线程死锁 30

1.9.1 什么是线程死锁 30

1.9.2 如何避免线程死锁 33

1.10 守护线程与用户线程 35

1.11 ThreadLocal 39

1.11.1 ThreadLocal 使用示例 40

1.11.2 ThreadLocal 的实现原理 42

1.11.3 ThreadLocal 不支持继承性 45

1.11.4 InheritableThreadLocal 类 46

第2 章 并发编程的其他基础知识 50

2.1 什么是多线程并发编程 50

2.2 为什么要进行多线程并发编程 51

2.3 Java 中的线程安全问题 51

?2.4 Java 中共享变量的内存可见性问题 52

2.5 Java 中的synchronized 关键字 54

2.5.1 synchronized 关键字介绍 54

2.5.2 synchronized 的内存语义 55

2.6 Java 中的volatile 关键字 55

2.7 Java 中的原子性操作 57

2.8 Java 中的CAS 操作 59

2.9 Unsafe 类 59

2.9.1 Unsafe 类中的重要方法 59

2.9.2 如何使用Unsafe 类 61

2.10 Java 指令重排序 65

2.11 伪共享 67

2.11.1 什么是伪共享 67

2.11.2 为何会出现伪共享 68

2.11.3 如何避免伪共享 70

2.11.4 小结 72

2.12 锁的概述 72

2.12.1 乐观锁与悲观锁 72

2.12.2 公平锁与非公平锁 75

2.12.3 独占锁与共享锁 75

2.12.4 什么是可重入锁 76

2.12.5 自旋锁 77

2.13 总结 77

第二部分 Java 并发编程高级篇

第3 章 Java 并发包中ThreadLocalRandom 类原理剖析 80

3.1 Random 类及其局限性 80

3.2 ThreadLocalRandom 82

3.3 源码分析 84

3.4 总结 87

第4 章 Java 并发包中原子操作类原理剖析 88

4.1 原子变量操作类 88

4.2 JDK 8 新增的原子操作类LongAdder 93

4.2.1 LongAdder 简单介绍 93

4.2.2 LongAdder 代码分析 95

4.2.3 小结 101

4.3 LongAccumulator 类原理探究 102

4.4 总结 104

第5 章 Java 并发包中并发List 源码剖析 105

5.1 介绍 105

5.2 主要方法源码解析 106

5.2.1 初始化 106

5.2.2 添加元素 106

5.2.3 获取指定位置元素 108

5.2.4 修改指定元素 109

5.2.5 删除元素 110

5.2.6 弱一致性的迭代器 111

5.3 总结 114

第6 章 Java 并发包中锁原理剖析 115

6.1 LockSupport 工具类 115

6.2 抽象同步队列AQS 概述 122

6.2.1 AQS——锁的底层支持 122

6.2.2 AQS——条件变量的支持 128

6.2.3 基于AQS 实现自定义同步器 131

6.3 独占锁ReentrantLock 的原理 136

6.3.1 类图结构 136

6.3.2 获取锁 137

6.3.3 释放锁 142

6.3.4 案例介绍 143

6.3.5 小结 145

?6.4 读写锁ReentrantReadWriteLock 的原理 145

6.4.1 类图结构 145

6.4.2 写锁的获取与释放 147

6.4.3 读锁的获取与释放 151

6.4.4 案例介绍 156

6.4.5 小结 158

6.5 JDK 8 中新增的StampedLock 锁探究 158

6.5.1 概述 158

6.5.2 案例介绍 160

6.5.3 小结 164

第7 章 Java 并发包中并发队列原理剖析 165

7.1 ConcurrentLinkedQueue 原理探究 165

7.1.1 类图结构 165

7.1.2 ConcurrentLinkedQueue 原理介绍 166

7.1.3 小结 181

7.2 LinkedBlockingQueue 原理探究 182

7.2.1 类图结构 182

7.2.2 LinkedBlockingQueue 原理介绍 185

7.2.3 小结 194

7.3 ArrayBlockingQueue 原理探究 195

7.3.1 类图结构 195

7.3.2 ArrayBlockingQueue 原理介绍 197

7.3.3 小结 202

7.4 PriorityBlockingQueue 原理探究 203

7.4.1 介绍 203

7.4.2 PriorityBlockingQueue 类图结构 203

7.4.3 原理介绍 205

7.4.4 案例介绍 214

7.4.5 小结 216

7.5 DelayQueue 原理探究 217

7.5.1 DelayQueue 类图结构 217

7.5.2 主要函数原理讲解 219

7.5.3 案例介绍 222

7.5.4 小结 224

第8 章 Java 并发包中线程池ThreadPoolExecutor 原理探究 225

8.1 介绍 225

8.2 类图介绍 225

8.3 源码分析 230

8.3.1 public void execute(Runnable command) 230

8.3.2 工作线程Worker 的执行 235

8.3.3 shutdown 操作 238

8.3.4 shutdownNow 操作 240

8.3.5 awaitTermination 操作 241

8.4 总结 242

第9 章 Java 并发包中ScheduledThreadPoolExecutor 原理探究 243

9.1 介绍 243

9.2 类图介绍 243

9.3 原理剖析 245

9.3.1 schedule(Runnable command, long delay,TimeUnit unit) 方法 246

9.3.2 scheduleWithFixedDelay(Runnable command,long initialDelay, long delay,TimeUnit unit) 方法 252

9.3.3 scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnit unit) 方法 254

9.4 总结 255

第10 章 Java 并发包中线程同步器原理剖析 256

10.1 CountDownLatch 原理剖析 256

10.1.1 案例介绍 256

10.1.2 实现原理探究 259

10.1.3 小结 263

10.2 回环屏障CyclicBarrier 原理探究 264

10.2.1 案例介绍 264

10.2.2 实现原理探究 268

10.2.3 小结 272

?10.3 信号量Semaphore 原理探究 272

10.3.1 案例介绍 272

10.3.2 实现原理探究 276

10.3.3 小结 281

10.4 总结 281

第三部分 Java 并发编程实践篇

第11 章 并发编程实践 284

11.1 ArrayBlockingQueue 的使用 284

11.1.1 异步日志打印模型概述 284

11.1.2 异步日志与具体实现 285

11.1.3 小结 293

11.2 Tomcat 的NioEndPoint 中ConcurrentLinkedQueue 的使用 293

11.2.1 生产者——Acceptor 线程 294

11.2.2 消费者——Poller 线程 298

11.2.3 小结 300

11.3 并发组件ConcurrentHashMap 使用注意事项 300

11.4 SimpleDateFormat 是线程不安全的 304

11.4.1 问题复现 304

11.4.2 问题分析 305

11.4.3 小结 309

11.5 使用Timer 时需要注意的事情 309

11.5.1 问题的产生 309

11.5.2 Timer 实现原理分析 310

11.5.3 小结 313

11.6 对需要复用但是会被下游修改的参数要进行深复制 314

11.6.1 问题的产生 314

11.6.2 问题分析 316

11.6.3 小结 318

11.7 创建线程和线程池时要指定与业务相关的名称 319

11.7.1 创建线程需要有线程名 319

11.7.2 创建线程池时也需要指定线程池的名称 321

11.7.3 小结 325

11.8 使用线程池的情况下当程序结束时记得调用shutdown 关闭线程池 325

11.8.1 问题复现 325

11.8.2 问题分析 327

11.8.3 小结 329

11.9 线程池使用FutureTask 时需要注意的事情 329

11.9.1 问题复现 329

11.9.2 问题分析 332

11.9.3 小结 335

11.10 使用ThreadLocal 不当可能会导致内存泄漏 336

11.10.1 为何会出现内存泄漏 336

11.10.2 在线程池中使用ThreadLocal 导致的内存泄漏 339

11.10.3 在Tomcat 的Servlet 中使用ThreadLocal 导致内存泄漏 341

11.10.4 小结 344

11.11 总结 344

四、预售链接

https://item.jd.com/12450812.html

目录
相关文章
|
3天前
|
IDE Java 物联网
《Java 简易速速上手小册》第1章:Java 编程基础(2024 最新版)
《Java 简易速速上手小册》第1章:Java 编程基础(2024 最新版)
8 0
|
4天前
|
安全 Java 开发者
Java并发编程:深入理解Synchronized关键字
【4月更文挑战第19天】 在Java多线程编程中,为了确保数据的一致性和线程安全,我们经常需要使用到同步机制。其中,`synchronized`关键字是最为常见的一种方式,它能够保证在同一时刻只有一个线程可以访问某个对象的特定代码段。本文将深入探讨`synchronized`关键字的原理、用法以及性能影响,并通过具体示例来展示如何在Java程序中有效地应用这一技术。
|
5天前
|
安全 Java 调度
Java并发编程:深入理解线程与锁
【4月更文挑战第18天】本文探讨了Java中的线程和锁机制,包括线程的创建(通过Thread类、Runnable接口或Callable/Future)及其生命周期。Java提供多种锁机制,如`synchronized`关键字、ReentrantLock和ReadWriteLock,以确保并发访问共享资源的安全。此外,文章还介绍了高级并发工具,如Semaphore(控制并发线程数)、CountDownLatch(线程间等待)和CyclicBarrier(同步多个线程)。掌握这些知识对于编写高效、正确的并发程序至关重要。
|
5天前
|
安全 Java 程序员
Java中的多线程并发编程实践
【4月更文挑战第18天】在现代软件开发中,为了提高程序性能和响应速度,经常需要利用多线程技术来实现并发执行。本文将深入探讨Java语言中的多线程机制,包括线程的创建、启动、同步以及线程池的使用等关键技术点。我们将通过具体代码实例,分析多线程编程的优势与挑战,并提出一系列优化策略来确保多线程环境下的程序稳定性和性能。
|
5天前
|
缓存 分布式计算 监控
Java并发编程:深入理解线程池
【4月更文挑战第17天】在Java并发编程中,线程池是一种非常重要的技术,它可以有效地管理和控制线程的执行,提高系统的性能和稳定性。本文将深入探讨Java线程池的工作原理,使用方法以及在实际开发中的应用场景,帮助读者更好地理解和使用Java线程池。
|
6天前
|
Java API 数据库
深研Java异步编程:CompletableFuture与反应式编程范式的融合实践
【4月更文挑战第17天】本文探讨了Java中的CompletableFuture和反应式编程在提升异步编程体验上的作用。CompletableFuture作为Java 8引入的Future扩展,提供了一套流畅的链式API,简化异步操作,如示例所示的非阻塞数据库查询。反应式编程则关注数据流和变化传播,通过Reactor等框架实现高度响应的异步处理。两者结合,如将CompletableFuture转换为Mono或Flux,可以兼顾灵活性和资源管理,适应现代高并发环境的需求。开发者可按需选择和整合这两种技术,优化系统性能和响应能力。
|
7天前
|
缓存 监控 Java
Java并发编程:线程池与任务调度
【4月更文挑战第16天】Java并发编程中,线程池和任务调度是核心概念,能提升系统性能和响应速度。线程池通过重用线程减少创建销毁开销,如`ThreadPoolExecutor`和`ScheduledThreadPoolExecutor`。任务调度允许立即或延迟执行任务,具有灵活性。最佳实践包括合理配置线程池大小、避免过度使用线程、及时关闭线程池和处理异常。掌握这些能有效管理并发任务,避免性能瓶颈。
|
7天前
|
设计模式 运维 安全
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第15天】在Java开发中,多线程编程是提升应用程序性能和响应能力的关键手段。然而,它伴随着诸多挑战,尤其是在保证线程安全的同时如何避免性能瓶颈。本文将探讨Java并发编程的核心概念,包括同步机制、锁优化、线程池使用以及并发集合等,旨在为开发者提供实用的线程安全策略和性能优化技巧。通过实例分析和最佳实践的分享,我们的目标是帮助读者构建既高效又可靠的多线程应用。
|
8天前
|
SQL 安全 Java
Java安全编程:防范网络攻击与漏洞
【4月更文挑战第15天】本文强调了Java安全编程的重要性,包括提高系统安全性、降低维护成本和提升用户体验。针对网络攻击和漏洞,提出了防范措施:使用PreparedStatement防SQL注入,过滤和转义用户输入抵御XSS攻击,添加令牌对抗CSRF,限制文件上传类型和大小以防止恶意文件,避免原生序列化并确保数据完整性。及时更新和修复漏洞是关键。程序员应遵循安全编程规范,保障系统安全。
|
9天前
|
Java 编译器
Java并发编程中的锁优化策略
【4月更文挑战第13天】 在Java并发编程中,锁是一种常见的同步机制,用于保证多个线程之间的数据一致性。然而,不当的锁使用可能导致性能下降,甚至死锁。本文将探讨Java并发编程中的锁优化策略,包括锁粗化、锁消除、锁降级等方法,以提高程序的执行效率。
13 4

热门文章

最新文章