并发编程笔记1

《Java 并发编程的艺术》笔记——第1章 并发编程的挑战 文章目录1.1 上下文切换1.1.1 多线程一定快吗?1.1.2 测试上下文切换次数和时长1.1.3 如何减少上下文切换1.1.4 减少上下文切换实战1.2 死锁1.3 资源限制的挑战1.4 本章小结 声明: 本博客是本人在学习《Java 并发编程的艺术》后整理的笔记,旨在方便复习和回顾,并非用作商业用途。 本博客已标明出处,如有侵权请告知,马上删除。 并发编程的目的是为了让程序运行得更快,但是,并不是启动更多的线程就能让程序最大限度地并发执行。在进行并发编程时,如果希望通过多线程执行任务让程序运行得更 阅读详情

一、什么是上下文切换?

即使只有一个CPU核心,它也能“同时”运行多个线程。秘诀就是时间片轮转。

  • CPU把时间切成很小的时间片(通常几十毫秒),分给每个线程。

  • 线程A用完时间片后,CPU会保存A当前的状态(寄存器、程序计数器等),然后切换到线程B。

  • 等下次再轮到A时,CPU会恢复之前保存的状态,让A继续执行。

这个“保存 → 切换 → 恢复”的过程,就叫一次上下文切换。

单次上下文切换的时间开销大约 小于1毫秒,虽然看似不大,但频繁切换累积起来就很可观了。

即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒(ms)。

CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。时间开销略小于1ms

二、单核 vs 多核:哪种场景更快?、

单核场景第一个更快(第二个有上下文切换),多核场景第二个更快

单核情况下,不管数量多大,串行一定最快,多核情况下,数量少,串行快,数量多,并行快

三、那多线程到底开多少个合适?

没有固定答案,取决于:

  • 服务器配置(CPU核心数、内存)

  • 任务类型(CPU密集型 vs IO密集型)

  • 实际压测结果

📌 一般通过多次性能测试得出一个范围,比如:“在我们当前8核服务器上,处理这个业务时,线程数在 50~80 之间性能最佳。”
切记:永远不要回答一个固定数字,要强调“需要根据实际情况测试”。

四、什么时候该用多线程?

核心原则:当CPU浪费比例(执行时间:等待时间)严重的情况下,适合用多线程。

举个例子:

  • 一个线程执行任务时,计算只占10%的时间,等待网络/磁盘占90%。

  • 如果只用单线程,那90%的时间CPU都在闲着。

  • 用多线程,可以在等待时切换到其他线程干活,提高CPU利用率。

✅ 结论:执行时间 / 等待时间 比值越低,越适合用多线程。

五、上下文切换次数怎么测?

六、如何减少上下文切换?

通常来说,性能最佳是指线程数量合适以及上下文切换合适

七、加锁相关知识点

要点说明
锁只能锁引用类型不能锁基本类型(如 int、boolean)
sleep() 会让出CPU但不会释放锁,其他线程依然无法进入同步块
加锁失败进入阻塞队列进入阻塞状态后,不会被OS调度选中,直到锁被释放

八、如何避免死锁?

Python爬虫实战:全方位解析前程无忧(51job)职位详情爬取及反爬破解 平台规模:覆盖全国各行业、数百万条岗位信息。数据特点:职位描述详细,职位标签丰富。数据价值:支持招聘趋势分析、职业发展研究、薪资行情调研。推荐Python 3.10+,支持最新async特性与库兼容。 阅读详情

相关推荐

附录B:Standard Delay Format(SDF)(上)

本附录将介绍标准延迟标注格式,并说明了如何在仿真中执行反标。 延迟格式描述了设计网表的单元延迟和互连走线延迟,无论设计是用两种主要硬件描述语言(VHDL或Verilog HDL)中的哪一种所描述的。 本章还会介绍仿真的反标(backannotation),STA的反标其实是一个简单直接的过程,其中DUA中的时序弧将由SDF所指定的延迟进行标注。

To the beyond and infinity! 5413

python并发编程笔记1

python并发编程笔记1 是根据蚂蚁学Python的视频做的笔记,方便自己后续回顾 视频链接:BV1bK411A7tV 老师的源码 这一份笔记对应的是视频的P1-P2 文章目录python并发编程笔记1P1-python并发编程简介1、并发编程涉及的模块:2、额外的函数辅助这些模块:P2-怎么选择多线程多进程多协程1、并发编程的三种方式课前提问:Thread已经解决了并发的问题了,为什么还要学习后面两种呢2、什么是CPU密集型计算、IO密集型计算?3、多线程、多进程、多协程的对比:4、怎么根据任务选择对应

nova1318的博客 275

手把手教你用TP4056和PMOS管搭建锂电池自动切换电路(含元器件选型指南)

本文详细介绍了如何使用TP4056和PMOS管搭建锂电池自动切换电路,包括核心架构设计、元器件选型指南和PCB布局优化。通过智能充电算法和电源路径切换模块,实现外部供电与锂电池的无缝切换,提升便携式设备的电源管理效率。

julia4scientist的博客 890

《Java并发编程的艺术》学习笔记 —— 第1章并发编程的挑战

并发编程的目的:        并发编程的目的是通过合理的利用,软件与硬件的性能,让程序的运行速度更快,所以并不是启动更多的线程就可以让程序最大程度的并发执行。 上下文切换:       即使是单核处理器也支持多线程执行代码, 多线程的实现方式是通过CPU给每个线程分配时间片来实现这个机制,因为时间片非常短,所以CPU通过不停的切换时间片,让我们感觉多线程并发执行,时间片一般是几十毫秒(ms...

zhaow823的博客 372

新年美食鉴赏——基于注意力机制CBAM的美食101分类

新年美食鉴赏——基于注意力机制CBAM的美食101分类一、数据预处理1.数据集介绍2.读取标签3.统一命名4.整理图片路径5.划分训练集与验证集6.定义美食数据集二、注意力机制1.简介2.卷积块注意力网络——CBAM通道注意力模块CAM空间注意力模块SAM3.将通道、空间注意力模块合并三、基于卷积块注意力模块的ResNet-CBAM1.代码实现2.模型测试3.查看网络结构4.模型训练5.模型预测四、总结与升华个人简介 春节是一年当中最隆重、最盛大的节日,吃得最好的一餐可能就是年夜饭了,想想就很激动呢!随着新

zbp_12138的博客 1万+

OpenCV实战:高效检测与识别多类型条码与二维码

本文详细介绍了如何利用OpenCV的BarcodeDetector和QRCodeDetector模块,高效实现EAN-13条形码与常见二维码的检测与识别。内容涵盖从环境搭建、单码识别到处理多二维码的完整流程,并分享了提升识别率的图像预处理与性能优化等实战技巧,帮助开发者一站式解决视觉项目中的条码识别需求。

weixin_29094539的博客 494

java并发编程学习笔记1

1.什么是JUC juc即java.util.concurrent 普通的线程代码类 Thread Runnable:没有返回值,效率相比callable相对较低 Lock所有已知实现类: ReentrantLock 可重入锁(常用) ReentrantReadWriteLock.ReadLock 读锁 ReentrantReadWriteLock.WriteLock 写锁 2.进程和线程 进程即一个程序的一次执行过程 一个进程往往包含多个线程,至少一个线程 java默认有两个线程:main线程和gc线程

a3026836480的博客 179

【ComfyUI报错解决】K采样器 mat1和mat2形状不匹配错误分析与修复 mat1 and mat2 shapes cannot be multiplied (77x2048 and 4096x

如果你在 ComfyUI 里遇到K采样器报错:mat1 和 mat2 shapes cannot be multiplied确认大模型和 LoRA 是否是同一版本(SDXL vs SD1.5,不能混用)。如果用了双 CLIP 加载器,要确认加载的类型和选择的模型类型是否匹配。加载→ 类型选flux加载 SDXL 专用的 clip/t5 → 类型选sdxl避免不同版本模型和 LoRA 混搭,保持一致性。模型+LoRA+CLIP 类型必须保持同一版本,不然就会报错。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2411

并发编程笔记1:并发bug的成因

前言:     最近在学习并发编程的知识,打算好好学习下并发这块,之前有处理过并发的问题,但是学的不够体系,知识比较零散. 所以买了极客时间的并发课程(java并发编程实战)和《并发编程实战》从头系统化的学一遍。这里记录一下自己的学习过程和心得之类的。     首先咱们得知道为啥会产生并发编程的bug,究其根本原因是因...

我想问问天的专栏 461

【AUTOSAR-E2E】-2.3-配置E2E:基于E2EPW配置一个RX接收的Signal Group(使用E2E Profile 1)

《共13页精讲》:此法也适用于E2E Profile 4/5/6/7/11/22 目录 1 检查CAN Matrix Arxml/DBC是否满足E2E需求 2 在DaVinci Developer中为Port添加E2E保护 3 在DaVinci Configurator settings设置 4 如何使用应用层的E2E保护 5 结尾 <--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> <-.

「汽车电子助手」的博客 3953

《PLECS仿真与实战:从建模到高端应用》-专栏文件目录

《PLECS仿真与实战:从建模到高端应用》是一本系统介绍PLECS电力电子仿真软件的实用指南。全书共10章,首先介绍软件安装与基础操作,包括RC电路仿真等入门内容;随后深入讲解各类电力电子电路的建模与仿真,涵盖整流、交交变换、直流变换、逆变等电路;最后探讨PWM控制建模和直流调速系统等高端应用。书中配有丰富的示例程序和波形分析方法,附录还包含电力电子器件、代码生成等实用资料。该书适合电力电子领域工程师和学生系统学习电路仿真技术。

544

并发编程学习笔记1

线程基础概念和java中的线程-0823 java中的线程和操作系统的线程是什么关系 1.java线程的本质 start方法启动后,调用软方法run() start()源码的线程控制原语 start0(); native方法,JNI方法,对应于一个c语言方法 怎么看这个方法,在github上下载open jdk方法 为什么下的是jdk11,编译jdk11必须要有jdk8的代码 底层是jvm.cpp jvm_startThread() pthread_create(),由glibC提供,四个参

liusiping0902的博客 214

C语言试题一之计算并输出n(包括n)以内能被5或9整除的所有自然数的倒数之和

1、题目 计算并输出n(包括n)以内能被5或9整除的所有自然数的倒数之和 2、源代码实现 #include <stdio.h> #include <math.h> double fun1(int n) { if (n <= 0) return 0; int i; double sum = 0.0; for (i = 1; i <= n;...

码莎拉蒂 1万+

Java并发编程的艺术-笔记1

并发编程的艺术-笔记1

0小黑喵0的博客 585

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

《并发编程艺术》读书笔记Part1

自用笔记记录一点读书心得,纯属自我满足,大家看个乐子

UchihaZed的博客 381

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

第1章 并发编程的挑战(笔记简写)

并发编程的目的是为了让程序运行得更快,但是,并不是启动更多的线程就能让程序最大限度地并发执行。在进行并发编程时,如果希望通过多线程执行任务让程序运行得更快,会面临非常多的挑战,比如上下文切换的问题、死锁的问题,以及受限于硬件和软件的资源限制问题.

m0_64421869的博客 522

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java 并发编程的艺术笔记——第1章 并发编程的挑战

1.1 上下文切换 减少上下文切换的方法: 无锁并发编程 CAS算法 使用最少线程 协程 1.2 死锁 避免死锁的常见方法: 避免一个线程同时获取多个锁 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源 尝试使用定时锁 对于数据库锁,加锁和解锁必须在一个数据库连接里 1.3 硬件和软件的资源限制 对于硬件资源限制 使用集群并行执行程序 对于软件资源限制 使用资源池将资源复用 最后,建议使用JDK并发包提供的并发容器和工具类来解决并发问题 ...

qq_31683033的博客 166

笔记《Java并发编程实战》[1]

《Java并发编程实践》笔记 1)父线程VS子线程:JVM要等到所有用户线程都结束后才会终止,或者调用System.exit()方法强制终止JVM。如果只有守护线程在运行,则JVM将会自动终止。在java中,父线程和子线程只是在运行时谁创建谁的关系。一旦线程被启动,这2个线程平等的没有父子关系,父线程一般结束不会影响子线程的运行。   2)线程会共享进程范围内的资源 =====...

三思而后行 169

《Java并发编程实践》笔记1——并发编程基础

1.线程安全定义: 当多个线程访问一个类时,如果不用考虑这些线程在运行时环境下的调度和交替执行,并且不需要额外的同步及在调用方代码不必做其他的协调,这个类的行为仍然是正确的,那么这个类就被称之为是线程安全的。简言之对于线程安全类的实例进行顺序或并发的一系列操作,都不会导致实例处于无效状态。 只有对象状态可变,且存在对象共享,才需要考虑线程安全。 可以通过下面的方法来确保线程安全: (1).

Tony Chen的专栏 5487

《C++并发编程实战(第二版)》读书笔记 chapter 1

挖坑。

YSK111的博客 188

java并发编程之美读书笔记-1

重温java并发编程之美-1 一个进程中有多个线程,多个线程共享进程的堆和方法区。但是每个线程有自己的程序计数器和栈区域。 程序计数器就是为了记录该线程让出CPU时的执行地址的,待再次分配到时间片时线程就可以从自己私有的计数器指定地址继续执行。 如果执行的是native方法,那么pc计数器记录的是undefined地址,只有执行的是Java代码时pc计数器记录的才是下一条指令的地址。 每个线程都...

tianyadaoke2020的博客 240

Java并发编程实战笔记1.0

1.并发编程领域可以抽象成三个核心问题:分工、同步和互斥 分工指的是如何高效地拆解任务并分配给线程,而同步指的是线程之间如何协作,互斥则是保证同一时刻只允许一个线程访问共享资源。 2.并发编程领域问题的产生原因: 源头之一:缓存导致的可见性问题     一个线程对共享变量的修改,另外一个线程能够立刻看到,我们称为可见性。 源头之二:线程切换带来的原子性问题     我们把一个或者多个操作在CPU执...

过河的小卒子的博客 642

《Java并发编程实战》学习笔记(1)

又挖了一个待更新的坑。。。 书籍链接 学习的是2012版的《Java并发编程实战》,找了半天网上只有不带书签的pdf版,而优快云下载也因为版权问题不允许上传和下载这本书,于是自己用acrobat给这本书添加了书签,在这里放上百度云链接,有需自取,链接无效可以评论邮件发。 链接:https://pan.baidu.com/s/16Y56Yej5LvbSMRMhVfu...

TQY724的博客 362

JAVA并发编程实战读书笔记-1

java并发编程实战读书笔记

ByLir的博客 1002

【学习笔记】Java并发编程的艺术——第1章 并发编程的挑战

即使是单核处理器也支持多线程执行代码,CPU给每个线程分配CPU时间片实现多线程,而每个时间片一般是几十毫秒,所以多个线程感觉是同时执行的但同一个核切换线程执行时会保存运行状态,以便下次切回来后读取运行,所以有上下文切换。

Lchen_kk的博客 280
上一篇: JAVA容器类
下一篇: JAVA原子类
xuhaoyu_cpp_java
博客等级 码龄2年 2粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值