并发编程基础
1.CPU的多级缓存
数据的读取和存储都经过高速缓存,缓存和主存都链接在总线上。
使用多级缓存是为了缓解CPU和内存之间的速度不匹配问题
缓存的局部性原理:
时间局部性:如果某个数据被访问,那么不久的将来可能再次被访问
空间局部性:如果某个数据被访问,那么他相邻的数据可能再次被访问
缓存一致性MESI保证多个CPU cache之前缓存共享数据的一致性
2.CPU多级缓存的乱序执行优化
处理器为了提高速度做出违背代码原有顺序的优化。
int a = 100;
int b = 20;
int result = a*b;
cpu执行时可能先执行b=20,在执行a=100,最后执行result=a*b。
在单核情况下,这种优化不会对结果造成影响
在多核情况下,后写入内存的数据未必最后写入内存
例如,cpu1 写入一个数,再将标记置为true来标记数据已经写入,cpu2通过判定这个标记来决定这个数是否已经就绪,标记先写入,数据未完成(数据没有计算完成或者没有从处理器内存刷新到主存之中),产生不良的效果。
3.JAVA内存模型
JAVA内存模型规定了一个线程如何和何时可以看到有其他线程修改过的共享变量的值,以及在必须时如何同步的访问共享变量。
当CPU要读取主存时,先将数据读取到CPU高速缓存中,再到CPU寄存器上。
当CPU回写数据时,先将内部寄存器的值写回CPU高速缓存,再在某个时间点将数据写回主存。
同步的几种规则:
1.如果要把变量从主内存复制到工作内存,就需要按顺序的执行read,load操作,如果要把变量从工作内存同步回主内存中,就要按顺序的执行store和write操作。
2.不允许read和load,store和write操作单独出现
3.不允许一个线程丢弃它的最近assign的操作,即变量在工作内存中改变了必须同步到主内存中
4.不允许一个小陈给没有发生任何assign操作就把数据从工作内存同步回主内存
5.一个新变量只能在主内存中诞生,不允许在工作内存直接使用一个未被load或assign的变量
6.一个变量在同一时刻只允许一条线程对其进行lock操作,但lock操作可以被重复执行多次,多次执行lock操作后,只有执行相同次数的unlock操作,变量才会被解锁。lock和unlock必须成对出现。
7.如果对一个变量执行lock操作,将会清空工作内存中此变量的值,在执行引擎使用这个变量前要重新执行load或assign操作初始化变量的值。
8.如果一个变量事先没有被lock操作锁定,则不允许对其执行unlock操作,也不允许去unlock一个被其他线程锁定的变量
9.在对一个变量执行unlock操作之前,必须先把此变量同步到主内存中。
4.并发的优势与风险
优势1.程序设计在某些情况下更简单。
优势2.同时处理多个请求,等待时间变短,响应速度更快,复杂的操作可以多个线程进行。
优势3.CPU在等待IO时,可以处理其他事情。
风险1.多个线程共享数据时可能会产生与期望不符的结果。
风险2.某个操作无法继续进行时,可能发生活跃性问题,比如死锁等问题。
风险3.线程过多时,CPU切换频繁,调度时间增多。多线程还要使用同步机制来保证结果的正确性。
来源:CSDN
作者:kelett551
链接:https://blog.csdn.net/qq_40809792/article/details/102615943