【Java并发入门】01 并发编程Bug的源头
2023-03-31 10:43:20 时间
一、根本原因
「CPU、内存、磁盘之间的速度差异」
- 为了能同时执行多个任务,CPU 发展出时间片轮转、多核等
- CPU 要从内存中读数据太慢了,所以给自己设置了缓存
- CPU 读磁盘更慢了,所以可以让该线程阻塞
二、直接原因
缓存导致的可见性问题
CPU 把要处理的数据加载到自己的缓存中,处理完了放回自己的缓存。
另一个 CPU 同样的处理,就导致可能看不到上一个 CPU 处理的结果。
线程切换带来的原子性问题
程序中的一行代码往往不是一条 CPU 指令。
线程切换的时候,可能会在一个代码执行的中间地方切换。
编译优化带来的有序性问题
优化会为了更高效的利用 CPU 缓存,将代码指令重排。
这个重排的过程会导致看似没问题的代码,多线程出现逻辑问题。
三、为啥要遇到这些问题
- 为了提高程序的性能
- 引入了新方法,就要处理这个方法对应的问题
- 可以说是硬件工程师和操作系统工程师为了提高执行效率,给软件工程师带来的麻烦
接下来的几篇文章会介绍如何解决上面提到的「可见性、原子性、有序性」的问题。
相关文章
- 微软 Visual Studio Code Java 2 月更新发布:支持单元测试、GUI 项目开发、Gradle 项目创建等
- 在 Fedora Linux 上进行 Java 开发
- 并发场景下的底层细节 - 伪共享问题
- HarmonyOS 项目实战之通讯录(Java)
- Java代码审计项目-某在线教育开源系统
- Java开发人员编写SQL时常犯的十个错误
- 简单聊聊Redis中的几种Java客户端,以及它们的优缺点!
- 并发编程的原子性 != 事务ACID的原子性
- Java实战:hutool-db实现多数据源配置
- 频繁插入,用什么存储引擎更合适?
- JVM & MySQL时区配置问题-两行代码让我们一帮子人熬了一个通宵
- 测试开发工程师必备技术栈(附详细技术点)
- 2021 年 Java 开发者生产力报告
- Java 中 NullPointerException 的完美解决方案
- 三端一体计算方案:Unify SQL Engine
- 您遵循过这些Jenkins优秀实践吗?
- 每秒上千次高并发访问,HDFS优雅的抗住了
- 如何成为一名合格的Java程序员?
- 高并发+海量数据下如何实现系统解耦?「下」
- 我身边的高T,问了Java面试者这样的问题......