猜你喜欢
深入理解Java高并发编程

深入理解Java高并发编程

书籍作者:黄俊 ISBN:9787302591344
书籍语言:简体中文 连载状态:全集
电子书格式:pdf,txt,epub,mobi,azw3 下载次数:6996
创建日期:2022-11-05 发布日期:2022-11-05
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板
内容简介

《深入理解Java高并发编程》致力于介绍Java高并发编程方面的知识。由于多线程处理涉及的知识内容十分丰富,因此介绍时必须从Java层面的讲解一直深入到底层的知识讲解。为了帮助读者轻松阅读本书并掌握其中知识,本书做了大量基础知识的铺垫。在第1篇基础知识储备中,主要介绍计算机原理、并发基础、常见语言的线程实现、Java并发入门、JUC之Java线程池、JUC之同步结构、Java NIO详解等内容。在第2篇深入Java并发原理中,详细介绍了JUC包中所有使用的原子类的原理与源码实现;非常关键且容易出错的volatile关键字的原理,从Java、JVM、C、汇编、CPU层面对其进行详细讲解;synchronized在JVM中获取锁和释放锁的流程;JUC包的核心结构——AQS的原理与源码实现,通过逐方法、逐行的解释,帮助读者彻底掌握AQS中提供的获取锁、释放锁、条件变量等操作的实现与原理。最后,详细介绍了JVM中JNI的实现原理,将Java Thread对象中的所有方法在JVM层面的实现流程进行了详细描述,以帮助读者在使用这些方法时,知道底层发生了什么,以及发生异常时如何从容解决问题。

作者简介

黄俊,专注于研究Java语言, Hotspot, Linux内核,C语言与汇编,架构设计,多线程并发处理,专注于研究高效学习方式。曾就职于美团、阿里,前新东方业务架构师。

前言

为什么要写这本书

笔者平时喜欢钻研底层源码及原理,在工作中经常处理多线程并发问题。在解决问题的过程中,发现很多开发人员对于多线程并发的概念模糊不清,同时网络上充斥着各种谬误,导致开发人员对高并发处理始终雾里看花,抓不住重点,甚至产生畏惧心理。笔者阅读过CSAPP、《操作系统精髓》等书籍,发现其中包含了很多与高并发无关的知识,而很多读者又只想研究多线程并发的原理,因此常常走马观花,不能专注于多线程研究;同时,书中并没有指出有些内容是研究多线程的必要条件,所以很多读者会忽略这些细节,在后面研究多线程时由于缺少对应知识的支撑而无法理解其中的含义。基于此,笔者决定编写一本完全讲解多线程并发的书籍,分别从CPU、汇编、C语言、操作系统、C函数库、应用实现等多层面,讲解多线程的重点、难点。全书仅保留对多线程来说需要研究的知识点,以方便读者专注于多线程。

由于Java语言在业务编程领域占据举足轻重的地位,因此本书也对应用层面使用Java语言进行了描述,并对涉及Java多线程开发的几乎所有内容进行了讲解。同时,为了帮助读者在实际阅读源码时能真正读懂那些代码,笔者在写作过程中对所有涉及的源码都进行了逐行解释,力求帮助读者理解其中的含义和精髓。JUC包中包含了大量的线程同步、高并发处理结构、原子类,在实际工作中可能会涉及不同的结构运用,很多读者不理解其中的含义和实现原理,很容易在实际编码过程中误用,导致业务崩溃,但又因为对源码知识的欠缺,无法快速地解决问题,从而造成了业务的损失。此外,本书还将Java语言并发包JUC中几乎所有的结构实现源码及原理都进行了逐行解释,读者在遇到问题或者对源码产生困惑时,完全可以将本书作为工具书进行翻阅查询。

或许很多读者会问:volatile有什么语义?synchronized底层到底有没有进行锁升级和降级?锁升级时到底有没有自旋?在哪一步自旋?MESI协议和volatile到底有何关系?在Linux内核中如何控制并发?CPU又是如何处理的?为此,笔者在网上查阅了很多博客和文章,其中有很多内容偏离了主题,甚至描述不准确,也无法对其中的问题和本质进行描述,所以本书也对这些底层知识进行了详细的描述,以帮助喜欢钻研底层的读者顺利理解并掌握这些复杂的内容。

本书读者对象

本书适合以下读者阅读:需要求职进入互联网公司的读者;希望研究底层并发知识的读者;在工作中遇到瓶颈,希望提升底层知识的读者;从事开发高并发支撑中间件的读者;从事互联网高并发业务支撑的读者;对多线程编程感兴趣的读者。

背景学习知识

本书不介绍Java语言中有关变量、面向对象、泛型等Java SE的基础知识,所以读者在阅读本书时需要先学习和掌握Java SE。由于本书致力于研究JVM、Glibc、CPU等层面的知识,自然必不可少地涉及汇编语言、C语言以及C++语言,但读者只要熟悉Java语言基础,通过第1章知识的补充,阅读本书就不难。本书对于所有非Java语言知识的描述尽力做到了逐行解释,相信读者理解起来会很容易。而当掌握了C语言和Java语言的基础知识后,对于C++来说,就是在C层面增加了面向对象的特性。本书的例子和源码并没有用到很多C++的复杂操作,用得最多的就是C++的构造函数和析构函数,读者只要对其了解一二,阅读和理解起来就会轻松许多。

如何阅读本书

本书按照浅入深出的方式进行编写,但是由于书中的内容涉及大量底层知识,如果严格按照浅入深出的方式进行编写,难免会造成内容混乱,因此笔者在写作难点时,进行了大量的文字描述,相信能够帮助读者理解并掌握其中的含义。同时,笔者在编写结构和类的原理时,先介绍使用方式,再分析代码的实现,以便于读者能够在理解和使用之后再进行原理分析。本书对有些内容进行了一定的折中处理,且书中涉及的有些源码难度较高,需要读者静下心来,结合笔者给出的注释仔细品读。

本书在做Java源码分析和示例列举时使用了JDK 1.8的版本,在研究JVM底层时使用了Open JDK 1.8版本的Hotspot虚拟机源码,在研究C函数库时使用了Glibc 2.0的源码。由于在实际工作中我们使用的操作系统通常是Linux,而使用较多的CPU是AMD和intel,因此本书在写到对应CPU架构的知识时,选取的是intel X86平台的描述,因为它是32位处理器,相对于寄存器个数较多的64位处理器来说较为容易。

本书共分两篇,第1~7章为基础知识储备篇,第8~10章为深入Java并发原理篇。

第1章介绍计算机原理,详细描述汇编语言基础、C语言基础、计算机组成原理基础和OS概述。首先介绍汇编的历史、汇编中常用的寄存器、内联汇编的含义,以及C语言的基本数据类型、结构体、数组、指针等常用的概念,并且从汇编语言的角度分别描述它们的含义。然后介绍intel的历史、计算机程序的组成原理、内存地址相关概念,并且详细描述了一个C语言程序的指令过程原理。最后,是OS概述。读者可以通过本章快速补充欠缺的基础知识,然后开始研究并发处理相关的细节。

第2章介绍并发基础,首先详细介绍并行与并发的区别和原理,然后介绍传统OS下的并发控制原理,接着介绍在CPU层面上的并发控制原理,详细描述中断控制、缓存一致性协议、系统屏障、总线/缓存锁的概念。还介绍了Linux内核对于这些概念的使用,其中包含信号量、互斥锁、P-V原语、自旋锁等的实现。最后详细介绍Glibc和Pthread线程库在用户状态下常用的支持函数。读者可以从CPU、Linux内核、C函数库层面了解到并发控制的技巧,培养自己的计算机思维,这有助于帮助读者在实际编写高并发代码时提供灵感。

第3章和第4章详细描述不同语言之间的多线程实现原理,以及Java核心线程对象Thread类常用的变量和方法,并且介绍如何在Java中创建使用线程,如何实现线程的同步操作等。读者可以通过对这两章内容的学习,对Java的多线程处理有一个基础性的理解,为后面学习Java的多线程原理打下基础。

第5章介绍JUC之Java线程池、第6章介绍JUC之同步结构、第7章介绍Java NIO详解,在这3章中逐个方法、逐行地进行源码的解释。首先给出要介绍对象的例子,然后根据例子对其中使用的方法进行详细介绍。详细讲解Java常用的3大线程池的实现原理、JUC包所有同步结构的实现机制、NIO 3大组件的搭配使用。读者可以通过这3章的学习,彻底掌握其中的精髓和算法,从而在实际开发中合理地选择线程池和同步结构。通过NIO这一章,读者还可以掌握如何通过选择器来编写高并发的网络框架。

第8章中将详细说明Java的多线程支撑类Unsafe的核心方法的实现原理,以及Java中通过Unsafe实现的JUC包中的原子类的实现原理。读者可以了解到如何在高并发下合理运用这些原子类来做计数统计,通常能很好地提高性能。同时,其中关于多线程分治处理的算法,也可以帮助读者在实际编写多线程的过程中提供指导性方案。在8.3节中,笔者分了4个层次进行讲解,即Java、JVM、C语言和CPU,详细解释Java中volatile语义以及它的实现原理,读者可以从本节中详细了解volatile关键字的精髓以及使用场景。最后介绍synchronized关键字在JVM中锁膨胀升级和退出的源码实现,读者可以从中看到JVM在满足synchronized语义时所做出的努力与优化。

第9章介绍JUC的核心支撑结构AQS同步队列的实现原理,读者可以从中理解到AQS在JUC包中占据举足轻重的地位,以及它的设计理念,包括AQS如何实现synchronized关键字的排队、阻塞、唤醒等操作。

第10章介绍JVM如何实现Java的线程机制,读者可以通过学习本章的知识,了解JVM中JNI的实现原理,以及Java Thread对象的方法如何实现。读者可以从中学到Pthread线程库如何支撑整个Java层面的知识,了解到什么是JavaThread类,以及中断、停止、暂停、恢复、睡眠等方法的实现原理。最后介绍在Unsafe层面描述的线程操作支撑类Parker和JVM的支撑类ParkEvent、Monitor的原理,读者可以从中了解,在JVM层面如何结合线程库提供的线程操作类来搭配完成整个JVM线程的支撑原理。

学习、交流与勘误

本书的源代码讲解视频、差错勘误等,读者可扫描“文泉云盘”二维码获取。读者在学习过程中遇到难解的问题,对本书的改进想法以及宝贵意见,可在网站留言联系,大家共同学习,一起成长。本书笔者虽已再三审查,力求减少纰漏,但因水平有限,书中难免存在不足之处,恳请广大读者朋友们批评指正。


目录

第1篇 基础知识储备

第1章 计算机原理 2

1.1 汇编语言基础 2

1.1.1 汇编语言与机器语言 2

1.1.2 常见的寄存器 3

1.1.3 常见操作语句 6

1.1.4 内联汇编 6

1.1.5 常见助记符 9

1.2 C语言基础 12

1.2.1 基本数据类型 12

1.2.2 结构体原理 13

1.2.3 指针原理 19

1.2.4 指针与数组原理 21

1.3 计算机组成原理基础 23

1.3.1 intel的发展历史 23

1.3.2 计算机程序的组成 29

1.3.3 计算机的内存管理与内存地址原理 36

1.3.4 计算机程序的执行原理 44

1.4 OS概述 52

1.4.1 OS的发展历程和分类 53

1.4.2 常用的OS系统 56

1.5 小结 57

第2章 并发基础 58

2.1 并发与并行原理 58

2.1.1 并发 58

2.1.2 并行 59

2.1.3 并发与并行带来的问题 59

2.2 传统OS并发控制原理 60

2.2.1 P-V原语 60

2.2.2 信号量 61

2.2.3 互斥量 62

2.2.4 自旋锁 62

2.2.5 读写锁 63

2.2.6 死锁 64

2.3 CPU并发控制原理 66

2.3.1 中断控制 66

2.3.2 缓存一致性协议 67

2.3.3 系统屏障 69

2.3.4 总线/缓存锁 73

2.4 Linux内核并发控制原理 73

2.4.1 Linux内核信号量与P-V原语实现原理 74

2.4.2 Linux内核互斥量实现原理 80

2.4.3 Linux内核自旋锁实现原理 80

2.4.4 Linux内核读写锁实现原理 84

2.4.5 Linux内核中断控制与内核抢占原理 91

2.4.6 Linux内核seq锁实现原理 98

2.4.7 Linux内核rcu锁实现原理 100

2.5 Glibc和Pthread库原理 105

2.5.1 C标准、CRT与Glibc 105

2.5.2 LinuxThread与POSIX、NGTP、NPTL 107

2.5.3 NPTL常用函数与实现原理 108

2.6 小结 131

第3章 常见语言的线程实现 132

3.1 汇编语言多线程实现 132

3.2 C语言多线程实现 133

3.3 Go语言多线程实现 134

3.4 Python语言多线程实现 135

3.5 Java语言多线程实现 135

3.6 不同语言并发异同与知识推理 136

3.7 小结 136

第4章 Java并发入门 137

4.1 Java Thread类核心原理与方法 137

4.1.1 走进Thread 138

4.1.2 run方法 139

4.1.3 start方法 139

4.1.4 stop方法 140

4.1.5 destory方法 140

4.1.6 interrupt方法 141

4.1.7 sleep方法 142

4.1.8 join方法 142

4.1.9 Thread方法使用与线程状态转换 143

4.2 Runnable与Callable的使用 144

4.3 Future接口的使用 146

4.4 Promise接口的使用 147

4.5 volatile关键字的使用 147

4.6 synchronized关键字的使用 148

4.7 小结 149

第5章 JUC之Java线程池 150

5.1 Executor与ExecutorService详解 150

5.1.1 Executor接口原理 150

5.1.2 ExecutorService接口原理 151

5.2 ThreadPoolExecutor详解 156

5.2.1 ThreadPoolExecutor例子 156

5.2.2 ThreadPoolExecutor核心数据结构 156

5.2.3 execute方法的实现原理 159

5.2.4 shutdown方法实现原理 164

5.2.5 awaitTermination方法的实现原理 166

5.2.6 shutdownNow方法的实现原理 167

5.3 ScheduledThreadPoolExecutor详解 168

5.3.1 ScheduledThreadPoolExecutor例子 169

5.3.2 ScheduledExecutorService接口 170

5.3.3 ScheduledThreadPoolExecutor核心变量 170

5.3.4 scheduleAtFixedRate实现与原理 172

5.3.5 ScheduledFutureTask实现与原理 176

5.3.6 scheduleWithFixedDelay实现与原理 177

5.3.7 shutdown实现与原理 178

5.4 构建不同线程池 179

5.4.1 FixedThreadPool 179

5.4.2 SingleThreadExecutor 179

5.4.3 CachedThreadPool 180

5.4.4 SingleThreadScheduledExecutor 180

5.4.5 ScheduledThreadPool 181

5.5 ForkJoinPool详解 181

5.5.1 ForkJoinPool核心数据结构与方法 181

5.5.2 ForkJoinPool externalPush实现原理 185

5.5.3 ForkJoinPool externalSubmit实现原理 185

5.5.4 ForkJoinPool signalWork实现原理 187

5.5.5 ForkJoinPool tryAddWorker实现原理 188

5.5.6 ForkJoinPool createWorker实现原理 189

5.5.7 ForkJoinPool registerWorker实现原理 189

5.5.8 ForkJoinPool ForkJoinWorkerThread执行原理 190

5.5.9 ForkJoinPool scan窃取算法原理 191

5.5.10 ForkJoinPool runTask原理 194

5.5.11 ForkJoinPool awaitWork原理 196

5.5.12 ForkJoinPool切割子任务 197

5.5.13 ForkJoinTask doExec原理 198

5.5.14 ForkJoinTask fork原理 202

5.5.15 ForkJoinTask join原理 202

5.5.16 ForkJoinPool awaitJoin原理 204

5.5.17 ForkJoinPool tryRemoveAndExec原理 205

5.5.18 ForkJoinPool helpStealer原理 207

5.5.19 ForkJoinPool tryCompensate原理 209

5.5.20 ForkJoinPool shutdown原理 211

5.5.21 ForkJoinPool awaitTermination原理 214

5.5.22 ForkJoinPool总结 215

5.5.23 RecursiveAction原理 216

5.5.24 RecursiveTask原理 217

5.5.25 CountedCompleter原理 218

5.6 CompletableFuture详解 234

5.6.1 CompletableFuture 概念与例子 234

5.6.2 CompletableFuture CompletionStage接口 235

5.6.3 CompletableFuture runAsync原理 237

5.6.4 CompletableFuture postComplete原理 238

5.6.5 CompletableFuture Completion原理 239

5.6.6 CompletableFuture allOf原理 246

5.7 小结 253

第6章 JUC之同步结构 254

6.1 同步结构基础实现原理 254

6.1.1 Lock接口 254

6.1.2 Condition接口 255

6.1.3 LockSupport类 255

6.1.4 AQS类 256

6.1.5 队列核心接口 259

6.2 ReentrantLock实现与原理 262

6.3 ReentrantReadWriteLock实现与原理 264

6.4 Semapher实现与原理 271

6.5 FutureTask实现与原理 273

6.6 ArrayBlockingQueue实现与原理 278

6.7 LinkedBlockingQueue实现与原理 281

6.8 LinkedBlockingDeque实现与原理 284

6.9 LinkedTransferQueue实现与原理 288

6.10 SynchronousQueue实现与原理 295

6.11 PriorityBlockingQueue实现与原理 305

6.12 ConcurrentLinkedQueue实现与原理 310

6.13 ConcurrentLinkedDeque实现与原理 315

6.14 ThreadLocalRandom实现与原理 326

6.15 CopyOnWriteArrayList实现与原理 329

6.16 CopyOnWriteArraySet实现与原理 331

6.17 CountDownLatch实现与原理 333

6.18 CyclicBarrier实现与原理 335

6.19 ConcurrentHashMap实现与原理 338

6.20 ConcurrentSkipListMap实现与原理 354

6.21 ConcurrentSkipListSet实现与原理 363

6.22 Exchanger实现与原理 364

6.23 Phaser实现与原理 372

6.24 小结 380

第7章 Java NIO详解 382

7.1 NIO三剑客之Buffer原理 382

7.1.1 Buffer 383

7.1.2 ByteBuffer 385

7.1.3 HeapByteBuffer 394

7.1.4 MappedByteBuffer 396

7.1.5 DirectByteBuffer 398

7.2 NIO三剑客之Channel原理 403

7.2.1 Channel 403

7.2.2 FileChannel 404

7.2.3 SocketChannel 408

7.2.4 ServerSocketChannel 412

7.2.5 DatagramChannel 415

7.3 NIO三剑客之Selector原理 420

7.3.1 Selector 420

7.3.2 SelectionKey 423

7.4 小结 431

第2篇 深入Java并发原理

第8章 JVM synchronized与volatile原理详解 434

8.1 JVM源码分析之Unsafe类 434

8.1.1 compareAndSwap类方法实现原理 435

8.1.2 getIntVolatile方法实现原理 435

8.1.3 putIntVolatile方法实现原理 435

8.1.4 putOrderedInt方法实现原理 436

8.1.5 park方法实现原理 437

8.1.6 loadFence方法实现原理 438

8.1.7 storeFence方法实现原理 438

8.1.8 fullFence方法 438

8.2 JVM源码分析之原子类 439

8.2.1 AtomicInteger实现与原理 439

8.2.2 AtomicBoolean实现与原理 440

8.2.3 AtomicIntegerArray实现与原理 441

8.2.4 AtomicIntegerFieldUpdater实现与原理 443

8.2.5 AtomicLong实现与原理 445

8.2.6 AtomicLongArray实现与原理 446

8.2.7 AtomicLongFieldUpdater实现与原理 447

8.2.8 AtomicMarkableReference实现与原理 450

8.2.9 AtomicStampedReference实现与原理 451

8.2.10 AtomicReference实现与原理 454

8.2.11 AtomicReferenceArray实现与原理 454

8.2.12 AtomicReferenceFieldUpdater实现与原理 455

8.2.13 DoubleAccumulator实现与原理 457

8.2.14 DoubleAdder实现与原理 465

8.2.15 LongAccumulator实现与原理 466

8.2.16 LongAdder实现与原理 467

8.3 volatile原理分析 469

8.3.1 JVM内存模型 469

8.3.2 Java中happens-before原则 469

8.3.3 Java中Volatile语义 470

8.3.4 Java中Volatile字节码原理 472

8.3.5 JVM中putstatic和getstatic字节码原理 473

8.3.6 C/C++中的volatile原理 475

8.3.7 JVM中volatile对于禁止重排序的实现原理 477

8.3.8 从Pthread线程库分析C的volatile语义 480

8.3.9 JMM和CPU模型原理 484

8.4 synchronized源码分析 488

8.4.1 Java对象头原理 488

8.4.2 _monitorenter 获取锁过程原理 490

8.4.3 _monitorexit 释放锁过程原理 513

8.4.4 Object.wait 等待过程原理 518

8.4.5 Object.notify 唤醒过程原理 522

8.4.6 Object.notifyAll 唤醒全部过程原理 524

8.4.7 Object.hashcode 获取哈希码过程原理 526

8.5 小结 530

第9章 AQS源码详解 531

9.1 compare and swap原理详解 531

9.1.1 compare and swap概念 531

9.1.2 Java层面compare and swap实现原理 531

9.1.3 Hotspot虚拟机层面compare and swap实现原理 532

9.1.4 汇编层面compare and swap实现原理 533

9.2 AQS核心之Node类 533

9.3 AQS核心之head和tail变量 534

9.4 AQS核心之state变量 535

9.5 AQS核心之acquire过程原理 536

9.6 AQS核心之acquireInterruptibly过程原理 540

9.7 AQS核心之acquireShared过程原理 541

9.8 AQS核心之acquireSharedInterruptibly过程原理 544

9.9 AQS核心之release过程原理 544

9.10 AQS核心之releaseShared过程原理 545

9.11 AQS核心之条件变量原理 545

9.11.1 ConditionObject类 545

9.11.2 await Node等待操作原理 546

9.11.3 signal Node唤醒操作原理 550

9.11.4 相关工具方法详述 552

9.12 小结 553

第10章 JVM线程原理详解 554

10.1 JNI详述 554

10.1.1 JNI概念 554

10.1.2 JVM执行外部动态链接库原理 556

10.1.3 JVM执行内部动态链接库原理 578

10.1.4 JNIEnv结构体原理 583

10.2 Java Thread类源码解析 584

10.3 Java Thread Start原理解析 585

10.4 Java Thread Stop原理解析 592

10.5 Java Thread Interrupt原理解析 594

10.6 Java Thread isInterrupted原理解析 595

10.7 Java Thread Sleep原理解析 596

10.8 Java Thread Yield原理解析 598

10.9 Java Thread Suspend原理解析 599

10.10 Java Thread Resume原理解析 601

10.11 JVM Thread层级结构 601

10.12 JVM互斥体原理 605

10.12.1 ParkEvent与Parker原理 606

10.12.2 MutexLocker原理 614

10.12.3 MutexLockerEx原理 615

10.12.4 Mutex和Monitor原理 616

10.13 小结 623


短评

不错,棒棒的,在购物就是好,产品的品质有保障,感觉质量很放心,而且物流也还是一如既往的快速,基本隔天就到了。配送的快递小哥哥服务也是超级好,点赞,值得信赖。

2022-01-20 09:01:26

写的太好了,需要多看看

2021-12-28 13:17:41

底层原理讲得很好

2022-01-10 12:29:31

不错哦?,支持一下吧……

2021-12-12 12:05:56

黄师傅#

2021-12-03 18:54:45

东西已经收到!手感不错!用料扎实!质量很好!平常用基本没有问题!

2021-12-30 08:56:39

很厚实的一本书,内容质量还行。

2021-12-22 08:08:07

书不错书不错书不错书不错

2021-12-12 22:42:23

还可以吧,纸张看着可以

2021-12-12 01:12:26

学而不思则罔,思而不学则殆,需慢慢消化,支持作者!

2021-12-12 14:11:18

产品特色