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

  本篇文章为你整理了【Java并发入门】01 并发编程Bug的源头()的详细内容,包含有 【Java并发入门】01 并发编程Bug的源头,希望能帮助你了解 【Java并发入门】01 并发编程Bug的源头。

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

  - 为了能同时执行多个任务,CPU 发展出时间片轮转、多核等

  - CPU 要从内存中读数据太慢了,所以给自己设置了缓存

  - CPU 读磁盘更慢了,所以可以让该线程阻塞

  
 

  一、根本原因

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

  为了能同时执行多个任务,CPU 发展出时间片轮转、多核等

  CPU 要从内存中读数据太慢了,所以给自己设置了缓存

  CPU 读磁盘更慢了,所以可以让该线程阻塞

  二、直接原因

  缓存导致的可见性问题

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

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

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

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

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

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

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

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

  三、为啥要遇到这些问题

  为了提高程序的性能

  引入了新方法,就要处理这个方法对应的问题

  可以说是硬件工程师和操作系统工程师为了提高执行效率,给软件工程师带来的麻烦

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

  以上就是【Java并发入门】01 并发编程Bug的源头()的详细内容,想要了解更多 【Java并发入门】01 并发编程Bug的源头的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: