并发编程的由来
大家知道CPU 、内存、I/O设备的运行速度是坠崖式下降的。所以这就造成了当I/O设备在拉去资源时,CPU或内存是处于空闲状态,而程序中的语句大部分要访问内存,甚至有的还要去访问I/O设备,这就不可避免是的CPU处于空闲状态,而程序运行的快慢是有整体中最慢的设备运行速度决定的。进而为了合理的利用CPU的高性能,平衡三者之间的利用率,在计算机体系机构、操作系统、编程程序进行了优化。
具体体现:
1. CPU增加缓存,以均衡和内存的速度差异;
2. 操作系统增加进程,线程来分时复用CPU,进而均衡和I/O设备的速度差异;
3.编译优化程序的执行指令,使其更合理的利用CPU的缓存;
并发编程Bug的源头
- 可见性
- 原子性
- 有序性
导致的可见性问题
可见性:一个线程对某资源的操作对其他线程是可见的。如下代码线程T1将对象Person的age修改为‘18’对线程T2是可见的。
@Date
public class Person{
private String name;
private String age;
private Integer sex;
}
带来的原子性问题
原子性:我们把一个或多个操作在CPU上执行而不被中断的特性称为原子性。
注意:CPU只能保证CPU级别的原子操作,而无法保证程序语句的在CPU执行的原子操作。
带来的有序性问题
有序性:程序按照代码的先后顺序执行,而编译器在不影响最终结果的情况下为了优化性能,有时候会改变程序实际执行的顺序,这个时候如果在多线程运行环境中可能导致并发bug发生。
总结
写好并发编程,首先要知道并发程序可能出现问题的地方,只有知道bug可能才出现的地方才能有的放矢,才能写出健壮的并发程序。(:此次写的比较粗糙很多都没有流程图或者代码实例进行详细说明,后期和进行添加,谢谢大家的支持🙏。)
网友评论