1.什么是CPU多级缓存模型?

小陈:老王,最近学习并发不知如何入手,看的知识很零散;没多久又记不住了,你有啥好建议吗?

老王:来我这,我给你整理一下并发的知识和学习路线,能形成一个比较全面的知识图谱。聊起JAVA并发,还是需要把最基础的概念和知识梳理清楚,然后才能进入后面的深入的学习。

老王:我们先从CPU的多级缓存架构讲起,下面我画个图说一下CPU多级缓存架构:

1.什么是CPU多级缓存模型?_第1张图片

计算机为什么要设计高速缓存架构?

小陈:CPU和主内存之间为啥要有个高速缓存,CPU直接读写内存不可以吗?

老王:给你分析下原因就知道了:

CPU与主存运行速度的差异

CPU是计算机的大脑,是负责执行指令的;自身的频率和指令执行的速度非常快,一秒执行的指令大概10^9级别的;内存的的速度要比CPU慢上好几个级别,每秒处理的速度大概是10^6的级别的。

CPU长时间空闲

这样就会导致一个问题;如果CPU要频繁的访问主存的话,每次都需要等待很长的时间,执行性能就会低,大部分时间都在等待主存返回数据,没有发挥出CPU的性能

1.什么是CPU多级缓存模型?_第2张图片

 引入高速缓存,减少CPU等待时间,提升运行效率:

1.什么是CPU多级缓存模型?_第3张图片

多核CPU的多级缓存架构是怎么样的?

小陈:CPU和主存之间引入高速缓存的目的我知道了,就是为了减少CPU的等待时间,提高执行效率嘛,那多核CPU的多级缓存架构是怎样的?

老王:再给你画一张图,你就知道多核CPU的多级缓存架构是怎样的了:

1.什么是CPU多级缓存模型?_第4张图片

如上图所示,现代计算机一般都是多核CPU的,其中每个CPU都有自己的高速缓存,其中主内存是共用的。读取数据的时候先从主内存读取到自己的高速缓存中,CPU需要数据时先从自己的高速缓存中查找,找不到再去主内存中拉取,同时刷入自己的高速缓存中。 

多核CPU的多级缓存架构带来的缓存数据一致性问题

小陈:看了多核CPU的多级缓存架构图,这样相当于每个CPU都有自己的缓存吗?这样不会导致各个CPU的缓存之间数据不一致的问题吗?

老王:嘿嘿,看来小陈你挺聪明的,这个问题确实是存在的,下面来给你分析下这个问题产生的原因:

1.什么是CPU多级缓存模型?_第5张图片

如上图所示:在多线程并发操作的时候,由于CPU多级缓存的存在,有可能你修改了值,但是别的CPU的高速缓存还是旧值,CPU计算的时候使用了旧值计算,导致数据有问题。

关注小陈,公众号上更新更多的java并发文章

1.什么是CPU多级缓存模型?_第6张图片

小陈:老王,CPU的多级缓存模型我知道咋回事了,后面怎么解决这个问题呢;后面的学习路线是咋样的?

老王:别急,先给你一点点把底层的基础原理讲解了;至于后面的多级缓存数据一致性问题,后面的文章慢慢讲解你就懂了,至于后面的并发的学习,我列了个文章目录,咱们慢慢讲解。

JAVA并发文章目录(公众号)

JAVA并发专题 《筑基篇》

1.什么是CPU多级缓存模型?

2.什么是JAVA内存模型?

3.线程安全之可见性、有序性、原子性是什么?

4.什么是MESI缓存一致性协议?怎么解决并发的可见性问题?

JAVA并发专题《练气篇》

5.volatile怎么保证可见性?

6.什么是内存屏障?具有什么作用?

7.volatile怎么通过内存屏障保证可见性和有序性?

8.volatile为啥不能保证原子性?

9.synchronized是个啥东西?应该怎么使用?

10.synchronized底层之monitor、对象头、Mark Word?

11.synchronized底层是怎么通过monitor进行加锁的?

12.synchronized的锁重入、锁消除、锁升级原理?无锁、偏向锁、轻量级锁、自旋、重量级锁

13.synchronized怎么保证可见性、有序性、原子性?

JAVA并发专题《结丹篇》

14. JDK底层Unsafe类是个啥东西?

15.unsafe类的CAS是怎么保证原子性的?

16.Atomic原子类体系讲解

17.AtomicInteger、AtomicBoolean的底层原理

18.AtomicReference、AtomicStampReference底层原理

19.Atomic中的LongAdder底层原理之分段锁机制

20.Atmoic系列Strimped64分段锁底层实现源码剖析

JAVA并发专题《金丹篇》

21.AQS是个啥?为啥说它是JAVA并发工具基础框架?

22.基于AQS的互斥锁底层源码深度剖析

23.基于AQS的共享锁底层源码深度剖析

24.ReentrantLock是怎么基于AQS实现独占锁的?

25.ReentrantLock的Condition机制底层源码剖析

26.CountDownLatch 门栓底层源码和实现机制深度剖析

27.CyclicBarrier 栅栏底层源码和实现机制深度剖析

28.Semaphore 信号量底层源码和实现机深度剖析

29.ReentrantReadWriteLock 读写锁怎么表示?

30. ReentrantReadWriteLock 读写锁底层源码和机制深度剖析

JAVA并发专题《元神篇》并发数据结构篇

31.CopyOnAarrayList 底层分析,怎么通过写时复制副本,提升并发性能?

32.ConcurrentLinkedQueue 底层分析,CAS 无锁化操作提升并发性能?

33.ConcurrentHashMap详解,底层怎么通过分段锁提升并发性能?

34.LinkedBlockedQueue 阻塞队列怎么通过ReentrantLock和Condition实现?

35.ArrayBlockedQueued 阻塞队列实现思路竟然和LinkedBlockedQueue一样?

36.DelayQueue 底层源码剖析,延时队列怎么实现?

37.SynchronousQueue底层原理解析

JAVA并发专题《飞升篇》线程池底层深度剖析

38. 什么是线程池?看看JDK提供了哪些默认的线程池?底层竟然都是基于ThreadPoolExecutor的?

39.ThreadPoolExecutor 构造函数有哪些参数?这些参数分别表示什么意思?

40.内部有哪些变量,怎么表示线程池状态和线程数,看看道格.李大神是怎么设计的?

41. ThreadPoolExecutor execute执行流程?怎么进行任务提交的?addWorker方法干了啥?什么是workder?

42. ThreadPoolExecutor execute执行流程?何时将任务提交到阻塞队列? 阻塞队列满会发生什么?

43. ThreadPoolExecutor 中的Worker是如何执行提交到线程池的任务的?多余Worker怎么在超出空闲时间后被干掉的?

44. ThreadPoolExecutor shutdown、shutdownNow内部核心流程

45. 再回头看看为啥不推荐Executors提供几种线程池?

46. ThreadPoolExecutor线程池篇总结

你可能感兴趣的:(java并发专栏,缓存,并发编程,java)