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

一、根本原因

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

  • 为了能同时执行多个任务,CPU 发展出时间片轮转、多核等
  • CPU 要从内存中读数据太慢了,所以给自己设置了缓存
  • CPU 读磁盘更慢了,所以可以让该线程阻塞

二、直接原因

缓存导致的可见性问题

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

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

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

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

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

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

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

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

三、为啥要遇到这些问题

  • 为了提高程序的性能
  • 引入了新方法,就要处理这个方法对应的问题
  • 可以说是硬件工程师和操作系统工程师为了提高执行效率,给软件工程师带来的麻烦

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值