关于java:Java并发笔记01-并发编程Bug的源头

6次阅读

共计 414 个字符,预计需要花费 2 分钟才能阅读完成。

一、根本原因

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

  • 为了能同时执行多个工作,CPU 倒退出工夫片轮转、多核等
  • CPU 要从内存中读数据太慢了,所以给本人设置了缓存
  • CPU 读磁盘更慢了,所以能够让该线程阻塞

二、间接起因

缓存导致的可见性问题

CPU 把要解决的数据加载到本人的缓存中,解决完了放回本人的缓存。

另一个 CPU 同样的解决,就导致可能看不到上一个 CPU 解决的后果。

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

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

线程切换的时候,可能会在一个代码执行的两头中央切换。

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

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

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

三、为啥要遇到这些问题

  • 为了进步程序的性能
  • 引入了新办法,就要解决这个办法对应的问题
  • 能够说是硬件工程师和操作系统工程师为了进步执行效率,给软件工程师带来的麻烦

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

正文完
 0