发布时间:2022-11-28 文章分类:编程知识 投稿人:王小丽 字号: 默认 | | 超大 打印

【Java并发入门】01 并发编程Bug的源头

一、根本原因

「CPU、内存、磁盘之间的速度差异」

二、直接原因

缓存导致的可见性问题

CPU 把要处理的数据加载到自己的缓存中,处理完了放回自己的缓存。

另一个 CPU 同样的处理,就导致可能看不到上一个 CPU 处理的结果。

线程切换带来的原子性问题

程序中的一行代码往往不是一条 CPU 指令。

线程切换的时候,可能会在一个代码执行的中间地方切换。

编译优化带来的有序性问题

优化会为了更高效的利用 CPU 缓存,将代码指令重排。

这个重排的过程会导致看似没问题的代码,多线程出现逻辑问题。

三、为啥要遇到这些问题

接下来的几篇文章会介绍如何解决上面提到的「可见性、原子性、有序性」的问题。