并发编程为什么容易出现问题?它是怎么出问题的?
并发程序幕后的故事
随着硬件技术的发展,CPU、内存和I/O设备迎来了迅猛的发展。然而发展过程中,一直存在一个核心矛盾,CPU和
内存的速度差异,内存和I/O设备之间的速度差异。
CPU是天上一天,内存便是地上一年;内存是天上一天,那么I/O设备是地上10年。
木桶效应告诉我们要减小三者之间的差距,才能提高程序的性能。
解决方案,
1. CPU增加缓存,以均衡与内存的速度差异
2. 操作系统增加进程、线程,分时复用CPU,进而均衡CPU与I/O设备的速度差异
3. 编译程序指令重排序
并发编程的目的是,高效利用CPU和I/O资源,提高程序的运行速度。
为了减少CPU、内存和I/O设备间的速度差异,诞生了缓存、线程和指令重排序,
但是却导致了可见性、原子性和有序性的问题。这便是并发编程bug的源头。
1. 缓存导致的可见性问题
2. 线程导致的原子性问题
3. 指令重排序导致的有序性问题
从CPU单核和多核的方面考虑一下