加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.0577zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

线程池linux 《深入理解Java高并发编程》

发布时间:2022-10-13 02:01:06 所属栏目:Linux 来源:转载
导读: 为什么要写这本书笔者平时喜欢钻研底层源码及原理,在工作中经常处理多线程并发问题。在解决问题的过程中,发现很多开发人员对于多线程并发的概念模糊不清,同时网络上充斥着各种谬误,导致

为什么要写这本书笔者平时喜欢钻研底层源码及原理,在工作中经常处理多线程并发问题。在解决问题的过程中,发现很多开发人员对于多线程并发的概念模糊不清,同时网络上充斥着各种谬误,导致开发人员对高并发处理始终雾里看花线程池linux,抓不住重点,甚至产生畏惧心理。笔者阅读过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线程的支撑原理。学习、交流与勘误本书的源代码讲解视频、差错勘误等,读者可扫描“文泉云盘”二维码获取。读者在学习过程中遇到难解的问题,对本书的改进想法以及宝贵意见,可在网站留言联系,大家共同学习,一起成长。本书笔者虽已再三审查,力求减少纰漏,但因水平有限,书中难免存在不足之处,恳请广大读者朋友们批评指正。

more >

(编辑:温州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!