并发编程Bug源头

简介: 并发编程Bug源头

一.简介

编写正确的并发程序是一件困难的事情,往往调试过程中发生很多不确定的事情,这时需要对理论知识的一个认知,能够准确的追踪问题。

二.硬件背景

CPU,内存,I/O设备不断迭代,这三者速度存在差异,CPU和内存的速度差异可以形象的描述:CPU速度最快,内存次之,I/O设备更次之。

为了合理利用CPU的高性能,平衡这三者的速度差异,计算机体系结构、操作系统、编译程序都做出了贡献,主要体现为:

  • CPU增加缓存,以均衡与内存速度差异;
  • 操作系统增加了进程、线程,以分时复用CPU,进而均衡CPU与I/O设备的速度差异;
  • 编译程序优化指令执行次序,使得缓存能够更合理利用。

三.源头

3.1 源头一

缓存导致的可见性问题

在单核时代,所有的线程都是在一颗 CPU 上执行,CPU 缓存与内存的数据一致性容易解决,所有都是串行。

一个线程对共享变量的修改,另一个线程能够立刻看到,我们称为可见性。

image.png

多核时代,每颗 CPU 都有自己的缓存,这时 CPU 缓存与内存的数据一致性就没那么容易解决了,当多个线程在不同的 CPU 上执行时,这些线程操作的是不同的 CPU 缓存。

3.2 源头二

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

由于 IO 太慢,早期的操作系统就发明了多进程,即便在单核的 CPU 上我们也可以一边听着歌,一边写 Bug,这个就是多进程的功劳。

操作系统允许某个进程执行一小段时间,例如 50 毫秒,过了 50 毫秒操作系统就会重新选择一个进程来执行(我们称为“任务切换”),这个 50 毫秒称为“时间片”。

image.png

我们把一个或者多个操作在 CPU 执行的过程中不被中断的特性称为原子性。CPU 能保证的原子操作是 CPU 指令级别的,而不是高级语言的操作符,这是违背我们直觉的地方。因此,很多时候我们需要在高级语言层面保证操作的原子性。

我们把一个或者多个操作在 CPU 执行的过程中不被中断的特性称为原子性。

“原子性”的本质是什么?其实不是不可分割,不可分割只是外在表现,其本质是多个资源间有一致性的要求,操作的中间状态对外不可见。

3.3 源头三

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

那并发编程里还有没有其他有违直觉容易导致诡异 Bug 的技术呢?有的,就是有序性。顾名思义,有序性指的是程序按照代码的先后顺序执行。编译器为了优化性能,有时候会改变程序中语句的先后顺序,例如程序中:“a=6;b=7;”编译器优化后可能变成“b=7;a=6;”,在这个例子中,编译器调整了语句的顺序,但是不影响程序的最终结果。不过有时候编译器及解释器的优化可能导致意想不到的 Bug。

四.总结

在介绍可见性、原子性、有序性的时候,特意提到缓存导致的可见性问题,线程切换带来的原子性问题,编译优化带来的有序性问题,其实缓存、线程、编译优化的目的和我们写并发程序的目的是相同的,都是提高程序性能。

参考

《Java并发编程实战》

目录
相关文章
|
存储 人工智能 大数据
云计算平台:AWS、Azure和Google Cloud的比较与选择
在当今数字化时代,云计算平台成为了企业和个人的首选。本文将重点比较三大主流云计算平台:AWS、Azure和Google Cloud,从性能、功能、可用性以及定价等方面进行综合评估,帮助读者更好地选择适合自己需求的云计算平台。
|
Ubuntu Linux
Manjaro Linux 安装 deb 软件包
“记得上次用 Manjaro Linux 的时候,还是上次:)”。三年前,工作都是在 Linux 下完成的——那时候的我还没买苹果电脑,每天的快乐就是折腾 Linux 发行版……
658 0
|
前端开发
如何用CSS实现不规则形状的背景
在设计网页时,有时需要用到不规则形状的背景。这种背景可以为网页带来更加生动的效果。在这篇文章中,我们将探讨如何用CSS实现不规则形状的背景。
1356 0
|
物联网
IoT物联网设备OTA固件升级开发实践
通过OTA方式,我们可以对分布在全球各地的IoT设备进行设备固件升级,而不必让运维人员各地奔波。
7766 0
|
JSON Java 数据格式
RestTemplate请求UnknownContentTypeException:no suitable HttpMessageConverter异常
RestTemplate请求UnknownContentTypeException:no suitable HttpMessageConverter异常
571 0
|
8月前
|
关系型数据库 数据库 PostgreSQL
【YashanDB知识库】kettle同步PG至崖山提示no encryption pg_hba.conf记录
在使用 Kettle 进行 PostgreSQL 至崖山数据库的数据同步时,可能出现连接报错。原因是 `pg_hba.conf` 文件未正确配置 IP 连接规则。此文件控制客户端认证,决定哪些主机和用户可连接数据库。解决方法为:在 `pg_hba.conf` 中添加允许的 IP 规则(如 `host all all 10.9.7.54/32 md5`),并重启 PostgreSQL 服务使配置生效。该问题影响所有版本。
|
人工智能 弹性计算 Cloud Native
《阿里云产品四月刊》—一文解读:阿里云 AI 基础设施的演进与挑战(1)
阿里云瑶池数据库云原生化和一体化产品能力升级,多款产品更新迭代
359 2
《阿里云产品四月刊》—一文解读:阿里云 AI 基础设施的演进与挑战(1)
|
SQL 存储 关系型数据库
(九)MySQL之MVCC机制:为什么你改了的数据我还看不见?
在《MySQL锁机制》这篇文章中,咱们全面剖析了MySQL提供的锁机制,对于并发事务通常可以通过其提供的各类锁,去确保各场景下的线程安全问题,从而能够防止脏写、脏读、不可重复读及幻读这类问题出现。
453 0
|
11月前
|
存储 人工智能 算法
《C++ 驱动:人工智能数据实时压缩与解压缩之路》
在AI时代,数据的高效处理至关重要。C++凭借其高性能和精细的内存控制,在AI数据实时压缩与解压缩中展现优势,支持AI应用高效运行。数据压缩技术通过特定算法减少存储空间或传输带宽,而C++通过丰富的库和高效执行,提供强大的技术支持,优化AI系统的性能和响应速度。无论是图像、视频还是文本数据,C++都能有效应对,为AI发展奠定基础。
193 7
|
机器学习/深度学习 自然语言处理 搜索推荐
预训练的词嵌入(Word Embedding)
预训练的词嵌入(Word Embedding)