小陈:老王,最近学习并发不知如何入手,看的知识很零散;没多久又记不住了,你有啥好建议吗?
老王:来我这,我给你整理一下并发的知识和学习路线,能形成一个比较全面的知识图谱。聊起JAVA并发,还是需要把最基础的概念和知识梳理清楚,然后才能进入后面的深入的学习。
老王:我们先从CPU的多级缓存架构讲起,下面我画个图说一下CPU多级缓存架构:
计算机为什么要设计高速缓存架构?
小陈:CPU和主内存之间为啥要有个高速缓存,CPU直接读写内存不可以吗?
老王:给你分析下原因就知道了:
CPU与主存运行速度的差异
CPU是计算机的大脑,是负责执行指令的;自身的频率和指令执行的速度非常快,一秒执行的指令大概10^9级别的;内存的的速度要比CPU慢上好几个级别,每秒处理的速度大概是10^6的级别的。
CPU长时间空闲
这样就会导致一个问题;如果CPU要频繁的访问主存的话,每次都需要等待很长的时间,执行性能就会低,大部分时间都在等待主存返回数据,没有发挥出CPU的性能
引入高速缓存,减少CPU等待时间,提升运行效率:
多核CPU的多级缓存架构是怎么样的?
小陈:CPU和主存之间引入高速缓存的目的我知道了,就是为了减少CPU的等待时间,提高执行效率嘛,那多核CPU的多级缓存架构是怎样的?
老王:再给你画一张图,你就知道多核CPU的多级缓存架构是怎样的了:
如上图所示,现代计算机一般都是多核CPU的,其中每个CPU都有自己的高速缓存,其中主内存是共用的。读取数据的时候先从主内存读取到自己的高速缓存中,CPU需要数据时先从自己的高速缓存中查找,找不到再去主内存中拉取,同时刷入自己的高速缓存中。
多核CPU的多级缓存架构带来的缓存数据一致性问题
小陈:看了多核CPU的多级缓存架构图,这样相当于每个CPU都有自己的缓存吗?这样不会导致各个CPU的缓存之间数据不一致的问题吗?
老王:嘿嘿,看来小陈你挺聪明的,这个问题确实是存在的,下面来给你分析下这个问题产生的原因:
如上图所示:在多线程并发操作的时候,由于CPU多级缓存的存在,有可能你修改了值,但是别的CPU的高速缓存还是旧值,CPU计算的时候使用了旧值计算,导致数据有问题。