前言

并行编程(parallel programming)的概念早在20世纪中期就已经提出,并在20世纪中晚期开始流行,不过受硬件限制,只在拥有高性能计算机的实验室和工业界中使用,参与并行编程的人员都是经过专门培训的。近年来,多核处理器的普及和众核处理器的不断发展为并行编程的普及提供了硬件支撑平台,人们不再为昂贵的硬件平台所限,越来越多的人开始有机会接触并使用并行编程技术,并行编程也不再局限于从事计算机编程的专业人士,其他行业的人员也开始使用该技术提升程序的性能。
高性能是计算机系统追求的目标之一,处理器无疑是提高计算机系统性能的核心部件。然而,由于处理器芯片的设计和制造工艺已经达到了极限,而且考虑到功耗和散热等问题,处理器的运算能力已经很难再通过增加晶体管的数量提高。2005年前后,处理器制造商不得不采用新的方式提高计算机的运算能力,Intel、AMD和IBM等公司利用并行计算理论的相关知识设计了多核处理器,希望以此继续提高处理器的运算速度。
随着多核处理器的普及,学术界和工业界普遍认为并行程序设计将成为未来软件开发技术的主流。并行程序设计不仅继承了传统程序设计中的理论和方法,而且对传统程序设计提出了许多新的挑战,突出表现在并行算法设计、并行基础架构、并行计算思维等方面。很多程序设计人员对于传统的串行程序设计较为熟悉,但对并行程序设计的相关理论和方法还有待于深入学习。
并行编程相关课程在中国科学技术大学、北京理工大学、哈尔滨工业大学、河北科技大学、西北农林科技大学等高校已经开设多年,国内外产出了一批优秀的教材,如《并行计算》《并行程序设计导论》《并行计算导论》等,这些教材各有特色,但随着技术的不断更新,相关教材的建设仍须进一步完善,亟须将并行程序设计技术和目前流行的编程语言结合起来,深入开展相关的科研和教学工作。国外在并行程序设计方面也有一些优秀的教材,理论和实践知识深入,但其撰写方式、逻辑思路和语言风格不符合我国学生的阅读习惯,不适合作为我国高等院校的教材。
为了帮助更多的人了解和掌握并行编程的理论、方法和技术,作者编写了本书,主要在Java语言的框架下介绍并行编程知识。虽然本书介绍的相关知识只是Java语言生态系统中之冰山一角,但也覆盖了绝大多数并行编程的概念以及JDK并发库中大部分并发工具类的使用方法。需要特别说明的是,JDK并发库只提供了一个并发编程工具库,并行编程过程中最重要的是并行编程思维习惯的培养。作者希望在介绍并发编程相关知识的同时,可以培养读者并发编程的思想和思维习惯,引领读者进入并行程序设计的宇宙中,为高性能程序设计人才的培养抛砖引玉,贡献自己的微薄力量。
支持多线程是Java语言的重要特征之一,在学习本书之前,读者应学习Java编程的基础知识。本书重点对Java多线程编程的相关知识进行介绍,具体内容涉及线程定义、线程管理、锁和原子操作、异步模式、线程协作、线程池和Fork/Join框架等内容,大部分内容在讲解知识的同时都通过例题加以演示,并在JDK最新版本下调试运行通过,大部分例题的演示采用“提出问题—分析问题—代码实现—结果展示—结果分析—相关讨论”的思路,力求做到明白透彻。然而由于作者的学识和水平所限,有些程序的代码可能不是最优的,恳请各位读者对本书的相关内容提出改进意见和建议,以继续优化本书。
本书的姊妹版是《并行编程(Python版)》,该书主要基于Python语言对并行程序设计方法进行介绍,主要内容涉及线程和进程编程、OpenMP共享内存并行编程模型、消息传递编程模型和异步编程等内容。由于都是讲述并行编程知识,部分内容将与本书重合,但使用了不同的语言对相关知识点进行了编程实现。由于JDK中没有提供消息传递和OpenMP的支持,因此本书偏重于共享内存并行程序设计知识,但《并行编程(Python版)》一书将从共享内存、消息传递等方面对并行程序设计方法进行介绍,是本书内容的有益补充,该书正在撰写中。两书将各有特色,各有千秋,形成互补,期望帮助读者根据自己熟悉的编程语言进行并行编程学习。
本书内容先进、结构合理、讲解详尽、例题丰富、深入浅出,是初学者学习并行编程概念、理论、方法和编程技巧的理想教材,适合普通高校、实践和工程类院校学生在学习高性能程序设计时使用,是高等院校学生和IT领域在职人员学习并行编程技术的理想教材和工具书,也可作为高性能计算技术人员的自修参考用书。本书不仅对JDK较早版本中的内容进行讲解,而且对JDK最新版本中发布的很多新的并发类和接口进行介绍。
全书共13章,第1章简要介绍并行程序设计的基础知识;第2章介绍Java线程创建;第3章介绍线程的管理;第4~5章讲解线程同步控制方法;第6章讲解异步编程模式;第7~8章介绍线程间协作和障栅的相关知识;第9~10章介绍线程池执行器和Fork/Join框架;第11章介绍如何使用线程安全的集合操作;第12章介绍如何定制适合特定需求的并发类;第13章通过大型实际应用程序例子对并行程序的开发进行介绍。
本书作为教材已经应用于河北科技大学信息科学与工程学院的本科生和研究生“并行程序设计”课程中,已经过两轮教学实践的检验,作者认为本书的内容安排能够适应教学进程,除了第4章内容可以选讲外,其他章节均安排合理,本书配套的教学内容在中国大学MOOC和超星学习通上配有视频讲解,欢迎广大读者在学习的同时对本书的视频内容批评指正。
在本书的写作过程中,很多计算机领域的学者和教师对本书的编写工作提出了很多建设性的意见和建议,国内外众多的经典教材、研究成果和相关网站也为本书提供了参考,在此一并表示衷心的感谢。感谢美国普渡大学计算机科学系张翔宇教授,在我做访问学者期间,张教授让我感受到了专业的学术精神和良好的科研氛围,也让我可以有时间对本书的内容进行思考,同时也给了我很多有益的建议,是难得的良师益友。此外,感谢我的家人,写作工作枯燥且耗时较长,但得到了他们的大力支持,他们承担了大部分繁杂的家务工作,让我可以集中精力,有更多的时间写作。特别感谢我的儿子,成长路上他学会了努力上进,学会了顽强拼搏,在生活中学会了关心他人,他常常在我写作几小时、腰酸背疼的时候给我捶背揉肩,使我可以享受这独一无二的待遇,父子情深,感恩遇见!
由于编者学识和水平有限,书中的错漏和不妥之处在所难免,恳请广大读者批评指正,以便今后不断完善、改进、优化本书。

2023年2月