第二章并发基础

2-1

CPU 多级缓存

2eqw.png

  • 为什么需要 CPU cache : CPU 频率太快了,快到主存跟不上了,这样在处理器时钟周期内,CPU常常需要等待主存,浪费资源。所以缓存的出现是为了缓解CPU 和内存之间速度不匹配的问题(结构:CPU->cache->memory)
  • CPU 缓存有什么意思
    1)时间局部性:如果没有数据被访问,那么在不久的将来它很可能被再次访问;
    2) 空间局部性:如果某个数据被访问,那么与它相邻的数据很快也可能被访问;
    adas.png

CPU 多级缓存-乱序执行优化

asd.png
- CPU 缓存的乱序执行在多核处理器的情况下容易出现 当前核使用了其他核错误的数据

Java内存模型(Java Memory Model,JMM)(面试会问)

qwe.jpg

Java 内存模型规范了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值以及在必须时 如何同步访问共享变量 队用栈和本地变量存放在线程栈上 对象存放在堆上,线程间的通讯必须经过主内存

qwe.png
- CPU 缓存 主存 之间的关系
所有的CPU 都可以访问主存
通常情况下CPU 需要读取主存的时候 他会将主存中的数据先读取到缓存中去 然后CPU将 缓存中的数据 读取到 CPU内部寄存器中(CPU Registers),当想将数据舒心回去的时候 会逐级刷新

Java内存模型与硬件的关联.jpg

线程间的通讯.png
如果线程间想通讯 那么就是所有的线程都是去主内存中去操作数据

Java内存模型-同步的八中操作

  • lock(锁定):作用于主内存的变量,把一个变量标识为一条线程独占状态
  • unlock(解锁): 作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定
  • read(读取): 作用于主内存的白能量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用
  • load(载入): 作用于 工作内存的变量,他把read 操作从主内存中得到的白能量值放入工作内存的变量副本中
  • use(使用):作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎
  • assign(赋值):作用于工作内存的变量,它把一个从执行引接收到的值赋值给工作内存的变量
  • store(存储):作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的 write的操作
  • write(写入):作用于主内存的变量,它把 store操作从工作内存中一个变量的值传送到主内存的变量中

Java内存模型-同步规则

  • 如果要把一个变量从主内存中复制到工作内存,就需要按顺寻地执行read和load操作,如果把变量从工作内存中同步回主内存中,就要按顺序地执行 -store和write操作。Java内存模型只要求上述操作必须按顺序执行,而没有保证必须是连续执行
  • 不允许read和load、 store和 write操作之一单独出现
  • 不允许一个线程丢弃它的最近 assign的操作,即变量在工作内存中改变了之后必须同步到主内存中
  • 不允许一个线程无原因地(没有发生过任何 assign操作)把数据从工作内存同步回主内存中
  • 一个新的变量只能在主内存中诞生,不允许在工作内存中直接使用一个未被初始化(load或 assign)的变量。即就是对一个变量实施use和 store操作之前,必须先执行过了 assign和load操作
  • 一个变量在同一时刻只允许一条线程对其进行lock操作,但lock操作可以被同一条线程重复执行多次,多次执行lock后,只有执行相同次数的 unlock操作,变量才会被解锁。lock和 unlock必须成对出现
  • 如果对一个变量执行lock操作,将会清空工作内存中此变量的值,在执行引擎使用这个变量前需要重新执行load或 assign操作初始化变量的值
  • 如果一个变量事先没有被lock操作锁定,则不允许对它执行unlock操作;也不允许去 unlock一个被其他线程锁定的变量
  • 对一个变量执行 unlock操作之前,必须先把此变量同步到主内存中(执行 store和 write操作)

asdf.png

并发的优势与风险

fsd.png

内容概要:本文介绍了多种开发者工具及其对开发效率的提升作用。首先,介绍了两款集成开发环境(IDE):IntelliJ IDEA 以其智能代码补全、强大的调试工具和项目管理功能适用于Java开发者;VS Code 则凭借轻量级和多种编程语言的插件支持成为前端开发者的常用工具。其次,提到了基于 GPT-4 的智能代码生成工具 Cursor,它通过对话式编程显著提高了开发效率。接着,阐述了版本控制系统 Git 的重要性,包括记录代码修改、分支管理和协作功能。然后,介绍了 Postman 作为 API 全生命周期管理工具,可创建、测试和文档化 API,缩短前后端联调时间。再者,提到 SonarQube 这款代码质量管理工具,能自动扫描代码并检测潜在的质量问题。还介绍了 Docker 容器化工具,通过定义应用的运行环境和依赖,确保环境一致性。最后,提及了线上诊断工具 Arthas 和性能调优工具 JProfiler,分别用于生产环境排障和性能优化。 适合人群:所有希望提高开发效率的程序员,尤其是有一定开发经验的软件工程师和技术团队。 使用场景及目标:①选择合适的 IDE 提升编码速度和代码质量;②利用 AI 编程助手加快开发进程;③通过 Git 实现高效的版本控制和团队协作;④使用 Postman 管理 API 的全生命周期;⑤借助 SonarQube 提高代码质量;⑥采用 Docker 实现环境一致性;⑦运用 Arthas 和 JProfiler 进行线上诊断和性能调优。 阅读建议:根据个人或团队的需求选择适合的工具,深入理解每种工具的功能特点,并在实际开发中不断实践和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值