小陈:老王,最近学习并发不知如何入手,看的知识很零散;没多久又记不住了,你有啥好建议吗?
老王:来我这,我给你整理一下并发的知识和学习路线,能形成一个比较全面的知识图谱。聊起JAVA并发,还是需要把最基础的概念和知识梳理清楚,然后才能进入后面的深入的学习。
老王:我们先从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的多级缓存模型我知道咋回事了,后面怎么解决这个问题呢;后面的学习路线是咋样的?
老王:别急,先给你一点点把底层的基础原理讲解了;至于后面的多级缓存数据一致性问题,后面的文章慢慢讲解你就懂了,至于后面的并发的学习,我列了个文章目录,咱们慢慢讲解。
2.什么是JAVA内存模型?
3.线程安全之可见性、有序性、原子性是什么?
4.什么是MESI缓存一致性协议?怎么解决并发的可见性问题?
5.volatile怎么保证可见性?
6.什么是内存屏障?具有什么作用?
7.volatile怎么通过内存屏障保证可见性和有序性?
8.volatile为啥不能保证原子性?
9.synchronized是个啥东西?应该怎么使用?
10.synchronized底层之monitor、对象头、Mark Word?
11.synchronized底层是怎么通过monitor进行加锁的?
12.synchronized的锁重入、锁消除、锁升级原理?无锁、偏向锁、轻量级锁、自旋、重量级锁
13.synchronized怎么保证可见性、有序性、原子性?
15.unsafe类的CAS是怎么保证原子性的?
16.Atomic原子类体系讲解
17.AtomicInteger、AtomicBoolean的底层原理
18.AtomicReference、AtomicStampReference底层原理
19.Atomic中的LongAdder底层原理之分段锁机制
20.Atmoic系列Strimped64分段锁底层实现源码剖析
21.AQS是个啥?为啥说它是JAVA并发工具基础框架?
22.基于AQS的互斥锁底层源码深度剖析
23.基于AQS的共享锁底层源码深度剖析
24.ReentrantLock是怎么基于AQS实现独占锁的?
25.ReentrantLock的Condition机制底层源码剖析
26.CountDownLatch 门栓底层源码和实现机制深度剖析
27.CyclicBarrier 栅栏底层源码和实现机制深度剖析
28.Semaphore 信号量底层源码和实现机深度剖析
29.ReentrantReadWriteLock 读写锁怎么表示?
31.CopyOnAarrayList 底层分析,怎么通过写时复制副本,提升并发性能?
32.ConcurrentLinkedQueue 底层分析,CAS 无锁化操作提升并发性能?
33.ConcurrentHashMap详解,底层怎么通过分段锁提升并发性能?
34.LinkedBlockedQueue 阻塞队列怎么通过ReentrantLock和Condition实现?
35.ArrayBlockedQueued 阻塞队列实现思路竟然和LinkedBlockedQueue一样?
36.DelayQueue 底层源码剖析,延时队列怎么实现?
37.SynchronousQueue底层原理解析
39.ThreadPoolExecutor 构造函数有哪些参数?这些参数分别表示什么意思?
40.内部有哪些变量,怎么表示线程池状态和线程数,看看道格.李大神是怎么设计的?