深入浅出Java多线程

c#小王子 c#小王子 2021-10-26 697 Java


深入浅出Java多线程


1 进程与线程基本概念


RedSpider社区介绍


RedSpider社区介绍


RedSpider技术社区始于2018年秋的成都。


在本书发布时,社区共五位活跃成员,均参与了本书的撰写及审校⼯作。他们的代 号分别是(排名按拼⾳排序,不分先后):灵鹤,⽑⽑⾍,潘帕斯雄鹰,萤⽕⾍, 啄⽊⻦。


活跃


RedSpider是⼀个⾮常活跃的技术社区,虽然现在成员⼈数不多,但是对于社区的 各种活动都⾮常积极和活跃。⽬前社区内部⼤多都是Java开发⼯程师,且都对技术 始终保持极⾼的热情。


RedSpider是⼀个⾃我驱动的技术学习社区,社区内部拥有⾮常丰富的活动形式, ⽐如⼀起开技术沙⻰、⼀起写博客、⼀起写书、⼀起写代码。

除了与技术相关的活动以外,我们还会偶尔线下聚餐和⼀起出去运动。虽然有⼀位 成员不在成都,但仍然会“云参与”到我们的每次线下活动。


敏捷


RedSpider技术社区是⼀个敏捷的技术社区。我们通过⼀些敏捷流程和⼯具来管理 社区的⽬标和进程。⽐如在写这本书的时候,我们使⽤了国内的Teambition软件来 追踪每篇⽂章的初稿和修订状态。 我们每两周⼀个迭代,我们会在迭代开始时安排下个迭代要做的事情,在迭代结束

的时候开迭代会议(Retro)总结这个迭代。 我们使⽤Git来管理整个书籍的编写⼯作,托管到GitHub上。 到⽬前为⽌总共有两百多次提交记录


开源与分享


经社区成员⼀致决定,本书将发布到GitBook。⼀⽅⾯是觉得出版纸质书⽐较麻 烦,要联系出版商以及排版成Word。另⼀⽅⾯,也算是想免费向⼤众分享RedSpider社区⼏个⽉以来的成果,开源本书也算是社区对中国Java开发者做出⼀ 点⼒所能及的贡献。


本书简介


笔者在读完市⾯上关于Java并发编程的资料后,感觉有些知识点不是很清晰,于是 在RedSpider社区内展开了对Java并发编程原理的讨论。鉴于开源精神,我们决定 将我们讨论之后的Java并发编程原理整理成书籍,分享给⼤家。 站在巨⼈的肩上,我们可以看得更远。本书内容的主要来源有博客、书籍、论⽂, 对于⼀些已经叙述得很清晰的知识点我们直接引⽤在本书中;对于⼀些没有讲解清 楚的知识点,我们加以画图或者编写Demo进⾏加⼯;⽽对于⼀些模棱两可的知识 点,本书在查阅了⼤量资料的情况下,给出最合理的解释。 写本书的过程也是对⾃⼰研究和掌握的技术点进⾏整理的过程,希望本书能帮助读 者快速掌握并发编程技术.


第⼀章 进程与线程的基本概念


1.1 进程产⽣的背景


最初的计算机只能接受⼀些特定的指令,⽤户每输⼊⼀个指令,计算机就做出⼀个操作。当⽤户在思考或者输⼊时,计算机就在等待。这样效率⾮常低下,在很多时 候,计算机都处在等待状态。


批处理操作系统


后来有了批处理操作系统,把⼀系列需要操作的指令写下来,形成⼀个清单,⼀次性 交给计算机。⽤户将多个需要执⾏的程序写在磁带上,然后交由计算机去读取并逐 个执⾏这些程序,并将输出结果写在另⼀个磁带上。 批处理操作系统在⼀定程度上提⾼了计算机的效率,但是由于批处理操作系统的指 令运⾏⽅式仍然是串⾏的,内存中始终只有⼀个程序在运⾏,后⾯的程序需要等待 前⾯的程序执⾏完成后才能开始执⾏,⽽前⾯的程序有时会由于I/O操作、⽹络等 原因阻塞,所以批处理操作效率也不⾼。


进程的提出


⼈们对于计算机的性能要求越来越⾼,现有的批处理操作系统并不能满⾜⼈们的需 求,⽽批处理操作系统的瓶颈在于内存中只存在⼀个程序,那么内存中能不能存在 多个程序呢?这是⼈们亟待解决的问题。 于是,科学家们提出了进程的概念。


进程就是应⽤程序在内存中分配的空间,也就是正在运⾏的程序,各个进程之间互 不⼲扰。同时进程保存着程序每⼀个时刻运⾏的状态。


程序:⽤某种编程语⾔(java、python等)编写,能够完成⼀定任务或者功能 的代码集合,是指令和数据的有序集合,是⼀段静态代码。


此时,CPU采⽤时间⽚轮转的⽅式运⾏进程:CPU为每个进程分配⼀个时间段,称 作它的时间⽚。如果在时间⽚结束时进程还在运⾏,则暂停这个进程的运⾏,并且CPU分配给另⼀个进程(这个过程叫做上下⽂切换)。如果进程在时间⽚结束前阻塞或结束,则CPU⽴即进⾏切换,不⽤等待时间⽚⽤完。


当进程暂停时,它会保存当前进程的状态(进程标识,进程使⽤的资源 等),在下⼀次切换回来时根据之前保存的状态进⾏恢复,接着继续执⾏。


使⽤进程+CPU时间⽚轮转⽅式的操作系统,在宏观上看起来同⼀时间段执⾏多个 任务,换句话说,进程让操作系统的并发成为了可能。虽然并发从宏观上看有多个 任务在执⾏,但在事实上,对于单核CPU来说,任意具体时刻都只有⼀个任务在占⽤CPU资源。


对操作系统的要求进⼀步提⾼


虽然进程的出现,使得操作系统的性能⼤⼤提升,但是随着时间的推移,⼈们并不 满⾜⼀个进程在⼀段时间只能做⼀件事情,如果⼀个进程有多个⼦任务时,只能逐 个得执⾏这些⼦任务,很影响效率。


⽐如杀毒软件在检测⽤户电脑时,如果在某⼀项检测中卡住了,那么后⾯的检测项也会受到影响。或者说当你使⽤杀毒软件中的扫描病毒功能时,在扫描病毒结束之前,⽆法使⽤杀毒软件中清理垃圾的功能,这显然⽆法满⾜⼈们的要求。


线程的提出


那么能不能让这些⼦任务同时执⾏呢?于是⼈们⼜提出了线程的概念,让⼀个线程执⾏⼀个⼦任务,这样⼀个进程就包含了多个线程,每个线程负责⼀个单独的⼦任务。


使⽤线程之后,事情就变得简单多了。当⽤户使⽤扫描病毒功能时,就让扫描病毒这个线程去执⾏。同时,如果⽤户⼜使⽤清理垃圾功能,那么可以先暂停扫描病毒线程,先响应⽤户的清理垃圾的操作,让清理垃圾这个线程去执⾏。响应完后再切换回来,接着执⾏扫描病毒线程。

注意:操作系统是如何分配时间⽚给每⼀个线程的,涉及到线程的调度策略,有兴趣的同学可以看⼀下《操作系统》,本⽂不做深⼊详解。


总之,进程和线程的提出极⼤的提⾼了操作提供的性能。进程让操作系统的并发性成为了可能,⽽线程让进程的内部并发成为了可能。多进程的⽅式也可以实现并发,为什么我们要使⽤多线程?多进程⽅式确实可以实现并发,但使⽤多线程,有以下⼏个好处:

进程间的通信⽐较复杂,⽽线程间的通信⽐较简单,通常情况下,我们需要使 ⽤共享资源,这些资源在线程间的通信⽐较容易。

进程是重量级的,⽽线程是轻量级的,故多线程⽅式的系统开销更⼩。


进程和线程的区别


进程是⼀个独⽴的运⾏环境,⽽线程是在进程中执⾏的⼀个任务。他们两个本质的区别是是否单独占有内存地址空间及其它系统资源(⽐如I/O):

进程单独占有⼀定的内存地址空间,所以进程间存在内存隔离,数据是分开的,数据共享复杂但是同步简单,各个进程之间互不⼲扰;⽽线程共享所属进程占有的内存地址空间和资源,数据共享简单,但是同步复杂。


进程单独占有⼀定的内存地址空间,⼀个进程出现问题不会影响其他进程,不影响主程序的稳定性,可靠性⾼;⼀个线程崩溃可能影响整个程序的稳定性,可靠性较低。进程单独占有⼀定的内存地址空间,进程的创建和销毁不仅需要保存寄存器和栈信息,还需要资源的分配回收以及⻚调度开销较⼤;线程只需要保存寄存器和栈信息,开销较⼩。


另外⼀个重要区别是,进程是操作系统进⾏资源分配的基本单位,⽽线程是操作系统进⾏调度的基本单位,即CPU分配时间的单位 。


1.2 上下⽂切换


上下⽂切换(有时也称做进程切换或任务切换)是指 CPU 从⼀个进程(或线程)切换到另⼀个进程(或线程)。上下⽂是指某⼀时间点 CPU 寄存器和程序计数器的内容。


寄存器是cpu内部的少量的速度很快的闪存,通常存储和访问计算过程的中间值提⾼计算机程序的运⾏速度。程序计数器是⼀个专⽤的寄存器,⽤于表明指令序列中 CPU 正在执⾏的位置,存的值为正在执⾏的指令的位置或者下⼀个将要被执⾏的指令的位置,具体实现依赖于特定的系统。


举例说明 线程A - B


1.先挂起线程A,将其在cpu中的状态保存在内存中。

2.在内存中检索下⼀个线程B的上下⽂并将其在 CPU 的寄存器中恢复,执⾏B线程。

3.当B执⾏完,根据程序计数器中指向的位置恢复线程A。


CPU通过为每个线程分配CPU时间⽚来实现多线程机制。CPU通过时间⽚分配算法来循环执⾏任务,当前任务执⾏⼀个时间⽚后会切换到下⼀个任务。 但是,在切换前会保存上⼀个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是⼀次上下⽂切换。上下⽂切换通常是计算密集型的,意味着此操作会消耗⼤量的 CPU 时间,故线程也不是越多越好。如何减少系统中上下⽂切换次数,是提升多线程性能的⼀个重点课题。



【下载地址】

百度网盘链接:https://pan.baidu.com/s/1jqLy8vzSnGCZdeY9jaOxNA

提取码:sn64


相关文章


使用-JFreeChart来创建基于web的图表

使用-JFreeChart来创建基于web的图表

XStream使用文档

XStream使用文档

WebService发布过程及常见问题

WebService发布过程及常见问题

webpack实战入门进阶调优分享

webpack实战入门进阶调优分享

weblogic调优参数及监控指标

weblogic调优参数及监控指标

weblogic节点管理

weblogic节点管理

weblogic管理控制台概述

weblogic管理控制台概述

weblogic-部署和启动

weblogic-部署和启动

WebLogic-Server-性能及调优-调优-Java-虚拟机

Java 虚拟机(Java virtual machine,简称 JVM)是一种虚拟“执行引擎”实例,可在微处理器上执行 Java 类文件中的字节码。调整 JVM 的方式会影响 Weblogic Server 和应用程序的性能。

Velocity用户教程

Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。

Velocity用户手册

Velocity 用户手册是帮助页面设计者和内容提供者认识 Velocity 和其简单而功能强大的脚本语言――Velocity 模板语言(VTL)。在手册上的许多例子,都是用 Velocity 插入动态的内容到网页上,但是所有的 VLT 例子都能应用到其他的页面和模板中。


文章热度: 166291
文章数量: 333
推荐阅读

FlashFXP绿色版网盘下载,附激活教程 1782

FlashFxp百度网盘下载链接:https://pan.baidu.com/s/1MBQ5gkZY1TCFY8A7fnZCfQ。FlashFxp是功能强大的FTP工具

Adobe Fireworks CS6 Ansifa绿色精简版网盘下载 1565

firework可以制作精美或是可以闪瞎眼的gif,这在广告领域是需要常用的,还有firework制作下logo,一些原创的图片还是很便捷的,而且fireworks用法简单,配合dw在做网站这一块往往会发挥出很强大的效果。百度网盘下载链接:https://pan.baidu.com/s/1fzIZszfy8VX6VzQBM_bdZQ

navicat for mysql中文绿色版网盘下载 1623

Navicat for Mysql是用于Mysql数据库管理的一款图形化管理软件,非常的便捷和好用,可以方便的增删改查数据库、数据表、字段、支持mysql命令,视图等等。百度网盘下载链接:https://pan.baidu.com/s/1T_tlgxzdQLtDr9TzptoWQw 提取码:y2yq

火车头采集器(旗舰版)绿色版网盘下载 1707

火车头采集器是站长常用的工具,相比于八爪鱼,简洁好用,易于配置。火车头能够轻松的抓取网页内容,并通过自带的工具对内容进行处理。站长圈想要做网站,火车头采集器是必不可少的。百度网盘链接:https://pan.baidu.com/s/1u8wUqS901HgOmucMBBOvEA

Photoshop(CS-2015-2023)绿色中文版软件下载 1824

安装文件清单(共46G)包含Window和Mac OS各个版本的安装包,从cs到cc,从绿色版到破解版,从安装文件激活工具,应有尽有,一次性打包。 Photoshop CC绿色精简版 Photoshop CS6 Mac版 Photoshop CC 2015 32位 Photoshop CC 2015 64位 Photoshop CC 2015 MAC版 Photoshop CC 2017 64位 Adobe Photoshop CC 2018 Adobe_Photoshop_CC_2018 Photoshop CC 2018 Win32 Photoshop CC 2018 Win64

知之

知之平台是全球领先的知识付费平台。提供各个领域的项目实战经验分享,提供优质的行业解决方案信息,来帮助您的工作和学习

使用指南 建议意见 用户协议 友情链接 隐私政策 Powered by NOOU ©2020 知之