如果你是一个资深的Java开发工程师,那么多线程与高并发变成便是一个不可或缺的知识组成部分,本文来源
一、并发编程基础概念
-
CPU的多级缓存
-
CPU缓存结构图:
主存-缓存-CPU
主存-多级缓存-CPU -
缓存存在的意义:增大CPU的利用率。因为内存的速度和CPU的速度相差实在太大,所以引入多级缓存来减少CPU资源的浪费。
- 时间局部性:很多的资源在很短一段时间内会多次访问,所以有了缓存就会减少直接和主存的数据读写,提高访问率;
- 空间局部性:我们在访问的资源的时候,内存中,这个资源周围的资源也很有可能被访问;
-
CPU多级缓存的一致性协议(MESI:Modified,Exclusive,Share,Invalid)
MESI- M:该缓存行只被缓存在当前CPU的缓存中,已经被修改,还没有把修改的数据写回主存,所以与主存的数据是不一致的;
- E:当M的被修改的数据写回到主存,那么就是Exclusive状态了,缓存行只被缓存在当前CPU的缓存中,即E状态的缓存数据被修改之后就会进入M状态,当其他CPU读取这块缓存的时候转化为S态;
- S:该缓存行可能被多个CPU缓存,并且各个缓存的数据与主存保持一致,如果其他的CPU修改了缓存数据,那么其他CPU中的缓存数据就会作废,这个时候缓存数据就进入了I态,即无效状态;
-
乱序执行优化
-
JAVA内存模型(Java Memory Model:JMM)
- 参考JVM初识
JVM缓存架构图
CPU缓存运行硬件架构图
JVM内存模型与硬件架构的差异
线程和主存关系 - 同步的8中操作:
- lock:作用于主存的变量,把一个线程标识为一个线程的独占状态;
- unlock:作用于主存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才能被其他的线程锁定;
- read:作用于主存的变量,把一个主存中的变量传输到线程独占的内存中,便于后续的load使用;
- load:作用于工作内存的变量,创建read结果的一个副本;
- use:作用于工作内存的变量,把工作内存的变量传输给执行引擎;
- assign:作用于工作内存的变量,把执行引擎的结果传输到工作内存中;
- store:作用于工作内存的变量,把工作内存中的变量写回主存;
-
write:作用于主存的变量,
image.png
-
并发的优势与风险
并发的优势与风险
- 参考JVM初识
-
-
一些基本概念
- 并发:针对只拥有单核CPU的场景下,任何一个时刻都只有一个任务在进行,但是每个任务被分配到很短的一个时间片上,这些时间片不断的轮播,造成感官上的
同时运行
,这种现象称为并发; - 并行和高并发(high concurrency):
- 并行:指的是在同一时刻,多个任务真正的同时执行,针对多核CPU或者多CPU的机器;
- 这里的高并发本质上指的是
高并行
处理任务,是互联网分布式系统架构设计中必须考虑的因素,高并发遇到的问题:多个线程同时抢夺同一个资源;
- 并发:针对只拥有单核CPU的场景下,任何一个时刻都只有一个任务在进行,但是每个任务被分配到很短的一个时间片上,这些时间片不断的轮播,造成感官上的
二、多线程的知识体系
- 线程安全
- 线程封闭
- 线程调度
- 同步容器
- 并发容器
- AQS
- JUC
三、高并发的解决思路
- 扩容
- 缓存
- 队列
- 拆分
- 服务降级与熔断
- 切库
- 分库分表
网友评论