没有合适的资源?快使用搜索试试~ 我知道了~
并发编程30.docx
需积分: 10 1 下载量 147 浏览量
2021-07-28
09:31:14
上传
评论
收藏 11.86MB DOCX 举报
温馨提示
试读
64页
并发编程30.docx
资源推荐
资源详情
资源评论
并发(Concurrency)和并行(Parallelism)
并发和并行是两个非常容易被混淆的概念。他们都可以表示两个或者多个任务一起执行,
但是侧重点有所不同。并发偏重于多个任务交替执行,而多个任务之间有可能还是串行
的,而并行是真正意义上的“同时执行”,下图很好地诠释了这点。
大家排队在一个咖啡机上接咖啡,交替执行,是并发;两台咖啡机上面接咖啡,是并行。
从严格意义上来说,并行的多任务是真的同时执行,而对于并发来说,这个过程只是交
替的,一会执行任务 A,一会执行任务 B,系统会不停地在两者之间切换。但对于外部
观察者来说,即使多个任务之间是串行并发的,也会造成多任务间并行执行的错觉。
并发说的是在一个时间段内,多件事情在这个时间段内交替执行。
并行说的是多件事情在同一个时刻同时发生。
实际上,如果系统内只有一个 CPU,而使用多进程或者多线程任务,那么真实环境中
这些任务不可能是真实并行的,毕竟一个 CPU 一次只能执行一条指令,在这种情况下
多进程或者多线程就是并发的,而不是并行的(操作系统会不停地切换多任务)。真实
的并行也只可能出现在拥有多个 CPU 的系统中(比如多核 CPU)。
面试问到高并发怎么回答?自己总结
什么是高并发?
高并发(High Concurrency)是一种系统运行过程中遇到的一种“短时间内遇到大量操作
请求”的情况,主要发生在 web 系统集中大量访问收到大量请求(例如:12306 的抢票情
况;天猫双十一活动)。该情况的发生会导致系统在这段时间内执行大量操作,例如对资
源的请求,数据库的操作等。
高并发 ≠ 多线程:
多线程对应的是
cpu
,高并发对应的是访问请求,
多线程只是高并发
其中解决方法之一
参照网址:https://blog.csdn.net/liuhuiteng/article/details/88371292
! 如果要想系统能够适应高并发状态,则需要从各个方面进行系统优化,包括, 硬件、网
络、系统架构、开发语言的选取、数据结构的运用、算法优化、数据库优化等……而多线
程只是其中解决方法之一。
高并发情况,不能通过平常的加锁就能解决,需要从系统整体架构设计方面解决,
1、 首先是静态资源分离——如页面,文件资源
2、 系 统 架 构 方 面 , 对 服 务 器 集 群 ( Nginx 、 Tomcat ) 采 用 lvs ( 虚 拟 机 ip )
+keepalived 保持心跳检测,实现自动重启,主从热备
3、 数据库方面可以采用读写分离,解决并发情况下数据库的压力,也可采用缓存形式,
解决数据库的压力。
4、 服务集群使用 api 网关,须用户鉴权、流量限制、熔断降级;保证注册用户使用,熔
断保证流量过大,采用友好提示:如当前下单用户过多,请稍后再试....
5、 对同一数据操作,采用缓存存储数据——比如下单库存数量,采用 redis 缓存,哨兵
机制保证主从集群高可用,对库存数量减少可以使用 redis 分布式锁,redis 单线程,
获取 key 是唯一,且执行效率高
6、 对于订单服务也采用集群模式,减轻单台服务器的压力。
7、 下单使用 mq 消息队列,采用异步形式处理订单,只要客户支付成功,在 redis 中减
库存成功,就生成一个订单记录,直接返回客户端下单成功;后面的出库等一系列操
作都用 mq 异步执行,实现解耦和异步,提高程序执行效率
8、 活动期间返回下单成功后,应当给予用户温馨提示——如:活动期间下单量过大,会
尽快为您安排出货
9、 分布式事务采用 lcn 解决,保证数据的一直性。
10、分布式日志可以采用 elk 日志记录,能够快速定位问题
简单回顾多线程
线程与进程的区别
一个进程可以有多个线程,就像一列火车,有多个车厢 进线
为什么要使用多线程
提高我们 Http 协议响应效率,能够对用户有一个比较好的体验。
使用多线程的好处
提高程序的执行效率。
如何理解多核多线程
如果是单核的 Cpu 的情况下,cpu 在同一个时刻只能执行一个线程。
存在切换过程 底层并不是真正多线程。
多核 举个例子:6 核 12 线程 能够同时开启 12 个线程同时运行,
减少 Cpu 切换。
多线程应用场景:
批量数据消费 100w 条数据,拆分多段
多线程五种状态
volatile 原理分析
原理:缓存一致性协议(MESI 协议)它确保每个缓存中使用的共享变量的副本是一致的
什么是 Volatile
能够保证线程可见性,当一个线程修改共享变量时,能够保证对另外一个线程可见性,
但是注意他不能够保证共享变量的原子性问题。
Volatile 的特性
可见性
能够保证线程可见性,当一个线程修改共享变量时,能够保证对另外一个线程可见性,
但是注意他不能够保证共享变量的原子性问题。
共享变量存放在主内存中
顺序性
程序执行程序按照代码的先后顺序执行。
原子性
即一个操作或者多个操作 要么全部执行并且执行的过程,要么失败。
Volatile 可见性
public class Mayikt extends Thread {
/**
* lock
锁 汇编的指令 强制修改值,立马刷新主内存中 另外线程立马可见刷新主
内存数据
*/
private static volatile boolean FLAG = true;
@Override
public void run() {
while (FLAG) {
}
}
public static void main(String[] args) throws
InterruptedException {
new Mayikt().start();
Thread.sleep(1000);
FLAG = false;
}
}
CPU 多核硬件架构剖析
CPU 每次从主内存读取数据比较慢,而现代的 CPU 通常涉及多级缓存,CPU 读主内存
按照空间局部性原则加载 局部快照到缓存中。
Java 内存模型 JMM
为什么会产生可见性的原因
因为我们 CPU 读取主内存共享变量的数据时候,效率是非常低,所以对每个 CPU 设置
对应的高速缓存 L1、L2、L3 是缓存我们共享变量主内存中的副本。
相当于每个 CPU 对应共享变量的副本,副本与副本之间可能会存在一个数据不一致性的问
题。
比如线程 B 修改的某个副本值,线程 A 的副本可能不可见,导致可见性问题。
CPU 的摩尔定律
https://baike.baidu.com/item/%E6%91%A9%E5%B0%94%E5%AE%9A%E5%BE
剩余63页未读,继续阅读
资源评论
qq_34802515
- 粉丝: 5
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功