【Java】《2小时搞定多线程》个人笔记(一)

简介: 【Java】《2小时搞定多线程》个人笔记

简介

基于慕课网站上的一个一元钱课程《2小时搞定多线程》的 个人笔记。

线程的起源

我们先来看看网络中关于线程起源的说明,理解线程的来龙去脉对于掌握多线程有一定帮助。

此部分内容整理自下面两篇网络博客:

线程的起源与计算机的发展息息相关。早期的计算机系统是单指令模式,资源利用效率低下。当批处理模式即计算机的多指令模式出现后,计算机资源利用率得到有效提升,但这种模式又经常导致 CPU 陷入等待状态,无法得到充分利用,于是进程出现了。

当用户对计算机发出一系列操作指令时,每个进程会将不同的操作储存起来,随时进行切换。但是进程的指令执行效率仍然不够快,无法在同一时刻执行多个任务。为了解决这一问题,技术人员又发明了线程。

有了线程以后,每个操作指令对应的任务都能够被划分为多个子任务,由每一个单独的线程负责,而不同的线程可以同时运行,这样计算机的运行效率便得到进一步提升。

我们可以把上面的几段内容做一个概括:

  1. 单指令模式(类似计算器)。
  2. 多指令模式(批处理)。
  3. 批处理存在CPU等待情况,进程诞生。
  4. 进程指令运行效率不满足需求,为了处理多任务线程诞生。

我们会发现这里存在一些不太清楚的概念,单指令是什么?多指令模式又是什么?为什么批处理存在CPU等待情况等等.....下面我们至上而下进行简单分析。

单指令模式(类似计算器)

在计算机诞生的最早期,计算机属于政府和一些大型公司才有的”昂贵“仪器,受制各种因素限制,当时计算机只能完成一些类似”1+1“的指令操作,并且要完成这样的操作需要用户把程序写入到打孔卡(可以看作最早期的存储设备)并由专门操作人员完成执行,整个过程非常繁琐。

受这样的工作模式限制,不管来多少个用户进行输入,也只能等待计算机管理人员拿到”指令“(物理意义上)完成执行。在”拿指令“和”执行“的间隙,整个计算机都是空闲不干活的,资源利用率极低。

多指令模式(批处理)

随着CPU的执行效率提升以及对CPU资源利用率的要求提升,计算机管理员逐渐成为执行瓶颈,由此诞生了多指令模式。 多指令模式类似饭店点餐一次性下多个指令批量完成。为此人们设计了对应的批处理操作系统,由它代替计算机管理员完成任务的执行切换工作,

批处理可以挨个执行多个指令,此时我们可以把整个计算机本身类比为”单进程“操作,所以批处理在某些情况下依然存在”闲置“的情况,比如4条指令中第3条需要访问IO设备,此时第4条指令哪怕和第3条没有任何关系也依然需要等待。

进程诞生

以上的工作模式被叫做”单道批处理操作系统“,后面为了解决等待问题,人们又设计了多道批处理操作系统(也叫多任务操作系统),它的改进优势如下:

  • 内存划分多个区域,每个区域存储一个程序。
  • 程序执行 I/O 操作时,操作系统会将 CPU 资源分配给其它等待执行的程序。

由此”进程“的基础概念便诞生了,进程就是执行中的应用程序,操作系统会为每个进程分配独立的内存、空间和所需要的资源(IO设备,文件等)。

线程诞生

但是随着计算机软硬件的发展,人们发现像进程这种”指挥军队“的粒度代价很高并且难以控制,后面又提出了线程的概念。

进程调度的一些问题:

  • 进程切换开销大。
  • 进程占用空间是独立的,实现进程通信难度很大。
  • 单个进程本身执行类似IO操作依然会出现等待情况。(只不过此时可以切换到其他进程)

至此我们简单梳理了单指令模式到线程诞生的全过程。

线程和进程的关系

线程包含于进程当中,进程是线程的集合

当操作系统运行时,至少有一个进程会启动,而这个进程中往往包含了多个线程。

线程和进程的区别

相同点如下:

两者都生命周期是由一样的,线程会随着进程结束而一起结束。

不同点如下:

  • 起源不同:先有进程后有线程,早期CPU为了跟上外部操作,后续出现线程的概念来提高效率。
  • 概念不同:线程是CPU调度的最小单位,而进程是操作系统调度程序的独立单位
  • 作用域不同:通常线程存在共享区域,但是在进程和进程之间内容不共享(除非使用类似IPC手段进行进程通信)。
  • 开销不同:进程之间通信需要内核辅助创建开销相对较大,而线程通信创建线程的开销很小。
  • 线程创建终止时间比进程短。
  • 同一个进程内线程切换时间比进程短。
  • 同一个进程内线程可以互相共享文件资源和内存,并且不依赖内核就可以完成。
  • 拥有资源不同,线程在拥有进程大部分基本资源之外还有独立的内容。
  • 数量不同:同一个进程通常只有一个,而每个进程至少有一个线程。

这里强调一下拥有资源不同的含义,线程共享内容包括:

  1. 进程代码段
  2. 进程公有资源(线程可以利用进程的共享资源简单通信)。
  3. 进程打开的文件描述符。
  4. 信号处理器。
  5. 进程当前目录。
  6. 进程ID进程组ID

线程独有内容包括:

  1. 寄存器的值
  2. 线程ID
  3. 线程名称
  4. 线程堆栈
  5. 错误返回号码
  6. 线程信号屏蔽码

Java 和 多线程

为了迎合时代需求,Java自诞生之初就天然支持多线程,Java的多线程实现是和内核线程一对一映射

Jvm 天然多线程验证

Jvm启动需要自动开启一些后台线程维持工作:

  • Finalize线程:处理部分对象的finalize操作。高版本jdk已经弃用此实现
  • Single signature:接收操作系统的信号量来进行一些操作,比如Kill的信号量接收强制关闭程序。
  • main 线程:也叫主线程,其他用户创建的线程都都叫做子线程
  • reference gc:垃圾回收线程,对象清理工作

为了证明上面的理论,我们可以通过IDEA进行调试来验证答案。

首先我们通过IDEA编写一个HelloWorld程序,当然为了方便这里个人直接拿了SpringBoot的Main启动代码进行验证。

java

复制代码

public class InterviewApplication {  
    public static void main(String[] args) {  
        SpringApplication.run(InterviewApplication.class, args);  
    }  
}

我们把Debug断点打在代码的第一行,然后Idea中直接Debug运行。

image.png

通过下面的筛选功能,我们可以Debug中切换到其他的线程进行观察多线程执行情况。

image.png

下面j结果使用为JDK11运行。

image.png

除了上面这种观察方式之外,我们可以通过“Threads“视图界面观察所有线程的运行情况。以IDEA2022版本为例,打开”Threads“视图只需要在右上角点击小方块然后勾选“Threads”即可。

下面结果使用JDK8运行。

image.png

个人更喜欢上面的展现方式,平铺直叙告诉开发者当前断点内的线程运行情况。

如果想要多线程Debug,可以鼠标右击断点,接着会出现相关提示切换到“Thread”,,在调试多线程代码的时候,这个操作会非常方便好用。

image.png

通过上面的简单讲解可以证明Java天生就是多线程程序(哪怕只有一行代码)。

理解多线程

多线程概念

一个进程中拥有多(≥2)个线程,线程之间相互协作、共同执行一个应用程序。

现代概念中把仅有单个线程工作的应用程序成为单线程程序。

多线程目的

  • 提高CPU处理效率。
  • 避免无效等待(IO过程可以别的事情)。
  • 提高用户体验,避免卡顿和缩短等待时间。
  • 并行处理:提高性能,多个线程接收http请求。
  • 安卓开发:主线程只能绘制界面。线程不允许io或者网络请求,避免卡顿影响体验。
  • 编程建模。
  • 摩尔定律失效之后,CPU的频率逐渐达到瓶颈,根本处理器越来越接近纳米工艺,再往下原子设计无法突破物理极限。导致单核的性能主频提升已经越过临界点。
  • CPU由单核转为多核多线程,多线程利用越发重要。
  • 阿姆达尔定律:处理器越多,处理效率越高,但是上限取决于串行部分的代码占比,占比越小性能越高。

阿姆达尔定律

在处理器运行单核速度放缓的今天,处理器开始追求多核心多线程,但是需要注意多线程的效率提升取决于代码能够用到多少并行性能

如果一个程序只能单核单线程串行运行,那么程序运行的时候多线程是没有任何意义的,如果代码支持一半并行一半串行,效率提升2倍,如果程序有95%支持并行,那就可以提升20倍性能。

通过下面这个图,可以很直观的看到并行带来质的提升。

image.png

多线程局限

多线程的引入不可避免的带来更为复杂的情况。

  • 异构化任务很难高效并行。
  • 性能安全问题。
  • 上下文切换。
  • 共享数据互相篡改幻读。
  • 缓存失效
  • 线程安全问题。
  • 编码设计逻辑漏洞等。
  • 活跃性问题(线程饥饿、死锁)。
  • 非原子操作问题(例如 i++)。

多线程的生活案例

这里列举生活中吃火锅的案例来理解多线程:

  1. 大火锅一个人吃:单进程单线程串行执行。
  2. 大火锅多人吃:单进程多线程。
  3. 每人小火锅:多进程多线程。
  4. 吃火锅底料:资源不足 。


【Java】《2小时搞定多线程》个人笔记(二)https://developer.aliyun.com/article/1395301

相关文章
|
5天前
|
存储 弹性计算 缓存
阿里云服务器租赁费用:新版租赁收费标准及活动报价参考
本文更新了2026年阿里云全系列云服务器租赁活动报价,所有特惠资源均可前往阿里云活动中心选购,整体覆盖从个人入门到企业级高性能场景的全梯度需求。其中轻量应用服务器主打极致性价比,2核2G峰值200M带宽配置每日10点、15点限时抢购价仅38元/年,2核4G配置379元/年起;高性价比的经济型e实例、通用算力型u2i实例覆盖2核4G至4核32G全档位,适配开发测试与中小型企业业务;搭载英特尔至强6处理器的第九代c9i企业级实例算力较上代提升20%,支撑高并发生产环境,不同实例规格价差清晰,用户可根据自身业务负载与预算灵活选型。
1570 111
|
12天前
|
云安全 人工智能 运维
阿里云联动百位企业安全专家,共识Agent防御最佳实践
当Agent成为新员工,你的安全边界在哪里?
1939 8
阿里云联动百位企业安全专家,共识Agent防御最佳实践
|
6天前
|
人工智能 程序员 API
Codex 接入 DeepSeek-V4-Flash:还能补上识图,提供两套方案
Codex 接入 DeepSeek-V4-Flash 怎么配?本文覆盖 CLI 与桌面端,再用 qwen3-vl-flash 补识图,两套方案可直接照做
|
6天前
|
编解码 人工智能 安全
2核4G/4核8G/8核16G阿里云服务器如何选择实例?经济型e、通用算力型u2i与计算型c9i选哪个?
本文介绍了阿里云2核4G、4核8G、8核16G三档主流配置下经济型e、通用算力型u2i和计算型c9i三种实例的最新活动价格与适用场景。同配置下三者价差显著,以2核4G为例,经济型e低至599.93元/年,计算型c9i则高达1742.08元/年。文章详细解析了各实例的性能定位:经济型e适合轻负载入门场景,u2i兼顾稳定算力与性价比,c9i凭借第9代至强处理器与芯片级安全能力支撑高性能业务。同时提示用户可叠加满减优惠券享受折上折,建议根据业务负载与预算综合决策。
526 112
|
18天前
|
人工智能 前端开发 Linux
Codex 桌面版安装 + CC Switch 接入第三方 API 完整教程(2026 最新)
2026最新教程:手把手教你安装Codex桌面版,通过CC Switch v3.17.0一键接入Fenno等国产API(兼容OpenAI Responses格式),跳过账号登录,完整启用代码审查、多步任务与上下文感知功能。零基础友好,全程图文实操。(239字)
2553 4
|
10天前
|
存储 人工智能 关系型数据库
阿里云AI产品与云产品最新组合套餐:Token Plan、AI coding及云服务器和建站等组合优惠价
阿里云推出全新“算力+模型+应用”一站式云与AI组合套餐活动,覆盖从个人开发者到中大型企业的全场景需求。核心亮点为分三档定价的Token Plan订阅服务,支持Qwen3.8-Max-Preview大模型调用,错峰时段最低可享0.2折优惠。活动同步推出AI Coding、智能体部署、云电脑托管、0代码建站等十余类场景化组合,搭配99元/年的普惠云服务器、88元/年的入门数据库等经典特惠产品,还为企业提供1V1定制化AI转型方案,大幅降低了不同用户群体拥抱AI的技术门槛与采购成本。
720 111
|
20天前
|
人工智能 JSON 安全
Fastjson远程代码执行漏洞,阿里云AI安全为您保驾护航
阿里云AI安全产品联动防御Fastjson攻击
2634 13
Fastjson远程代码执行漏洞,阿里云AI安全为您保驾护航
|
6天前
|
人工智能 JSON Shell
2026AI漫剧本地全开源方案(附各个软件模型链接),8G显卡也能流畅运行
这是一套完全本地化部署的AI漫剧生成技术链路:涵盖LLM剧本分镜生成、FLUX文生图(IP-Adapter人脸锁定)、StoryDiffusion时序连贯控制、LTX-2.3唇形同步视频生成,及ComfyUI全流程调度。零云端费用,仅耗硬件算力,单集2–4小时可产出竖屏短视频,适配抖音/B站分发。
|
7天前
Qoder 一周年 × Qwen3.8-Max 正式上线,多重好礼限时领
8月3日,Qwen3.8-Max 正式上线Qoder,迎来Qoder一周年。新老用户可领800次免费调用,下单再赠2000次;夜间(22:00–08:00)调用5折;邀请好友双方得积分与调用额度。
445 1