你真的了解吗?java高并发与多线程

这种情况,一般而言主要发生在web系统中,比如:京东双十一,微博明星传出绯闻,12306春运抢票等等。

很容易理解的东西我们不过多的作诠释,以下几项,是高并发的常用指标:

  • 响应时间(Response Time)

系统对请求作出的响应时间(一个请求从请求发出到请求结束的时间)

  • 吞吐量(Throughput)

单位时间内处理的请求数量

  • 每秒查询率QPS(Query Per Second)

每秒响应请求数。(其实与吞吐量指向同一个指标)

  • 并发用户数

同时承载正常使用系统功能的用户数量。

这里需要注意的是,我们经常会将高并发和多线程放在一起讲,但是他们之间并不能划等号,多线程只是高并发在应用代码层面的一种解决方案,然而一般情况下,高并发还需要系统架构,硬件设施,网络等多方面的调优协助完成。

【雪崩效应】

雪崩效应,原本出现在密码学中,后来引申入高并发场景的一个概念。

在密码学中,雪崩效应(Avalanche effect)指加密算法(尤其是块密码和加密散列函数)的一种理想属性。

雪崩效应是指当输入发生最微小的改变(例如,反转一个二进制位)时,也会导致输出的剧变(如,输出中一半的二进制位发生反转)。

服务雪崩效应是一种因"服务提供者的不可用"(原因)导致"服务调用者不可用"(结果),并将不可用逐渐放大的现象。

服务雪崩的过程可以分为三个阶段:

  1. 服务提供者不可用;

  2. 重试加大请求流量;

  3. 服务调用者不可用;

------如何避免

横向扩充服务------现在我们可以利用很多工具来保证服务不会挂掉,然后流量比较大的时候,可以横向扩充服务来保证业务的流畅。

限流(下个部分会讲)

熔断(下个部分会讲)

【高并发的四大利器】

对于软件系统而言,一般会有四大策略去保证应用的高并发:

  • 缓存(cache)

把常用数据存储到可以快速获取的区域(缓存区),以便重复利用,提高效率。

例如:从内存中读取数据时,先将常用的数据存放到缓存区,硬盘直接从缓存区读取。

在这地地方我们要注意:

我们平时所说的缓冲(buffer),和缓存不是同一回事,缓冲指的是在数据流转过程中,不同层次数据速度不一致时,利用缓冲区来缓解上下层之间速度问题,增加速度。

例如:将数据写入到内存时,先写入缓冲区,内存则直接从缓冲区中读取写入,减少IO次数,增加速度,降低对磁盘的损耗。

不过他们本质上都是为了提高效率。

  • 降级

当服务出现问题或影响到核心流程时,需要暂时屏蔽掉,待高峰过后或问题解决后再打开;

  • 限流

限流是高并发里面最重要也是最复杂的方法,当不可降级场景出现时,需要采用限流限制该场景的并发请求,有损服务而不是不服务。

通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级。

    • 超过阈值时策略:

定向到错误页或告知没有资源

返回兜底数据或默认数据,如商品详情页库存默认有货

    • 常见限流场景:

线程池

数据库连接池

并发请求数

接口调用速率

MQ的消费速率

    • 常见限流算法:

令牌桶:一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌,请求获取令牌,令牌不足时拒绝请求。

漏桶:流入速率过快,超过桶的容量,拒绝请求。

计数器(简单粗暴):当请求超过计数时,拒绝请求。

  • 熔断

降级往往代表系统功能部分不可用,熔断代表的是完全不可用。

降级一般是客户端处理,熔断是在服务端处理的。

服务熔断一般是指软件系统中,由于某些原因使得服务出现了过载现象,为防止造成整个系统故障,从而采用的一种保护措施,所以很多地方把熔断亦称为过载保护。

【进程】

首先我们看一下百度百科的解释:

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。

在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;

在当代面向线程设计的计算机结构中,进程是线程的容器。
程序是指令、数据及其组织形式的描述,进程是程序的实体。

其实用大白话讲,进程其实就是指在系统中正在运行的一个应用程序;

比如:我们电脑中运行的QQ,微信,LOL,都是一个进程。

进程主要有以下几个特性:

  • 独立性

进程是系统中独立存在的实体,它拥有自己独立的资源和自己私有的地址空间。

进程之间不可以直接访问资源和地址空间。

  • 动态性

程序(App)是一个静态的指令集和,进程是一个正在执行中的指令集合,进程拥有自己的生命周期和不同的生命形态。

  • 并发性

多个进程可以在单个处理器上并发执行,不会相互受到影响。(主要是依赖于线程和时间片)

一个进程里面可以由单个或者多个线程协同 完成任务。

【什么是多线程】

  • 首先,什么是线程?

教科书说法,线程是操作系统能够进行运算调度的最小单元。

一个进程可以有多个线程,但是一个线程只有一个父进程;

线程可以拥有自己的堆栈,程序计数器以及局部变量,但是不拥有系统资源。

其实呢,学过操作系统大家都知道,其实对于单核单CPU而言,同时是只能运行一个任务的,也就是说,同时只能跑一个线程;

如果咱们的CPU只能线性执行,就是当你运行一个线程的时候,这个线程可能要等待网络,IO等相关的资源,这个时候CPU只能等待,这样CPU强大的运算能力就没有得到发挥,所以,产生了一个时间片的概念;

    • 时间片

CPU给每个线程分配了一部分时间去运行,虽然CPU同时只能运行一个线程,但是我们进行线程的快速切换之后,可以模拟出一个CPU同时运行多个线程的场景(其实主要还是CPU太快了),这样的话可以充分利用CPU计算速度快的优势。(对于时间片,有很多种不同的算法,有兴趣可以百度,这里不讲)

在引入时间片以后,咱们一块CPU就可以同时跑多个线程了。

所以什么是多线程呢?

多线程指的是,在单个程序(或者进程)里面,可以运行多个不同的线程,执行不同的任务,最终完成整个程序的运行逻辑。

这里需要注意的是,线程是进程的子集,不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。

别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。

最后

权威指南-第一本Docker书

引领完成Docker的安装、部署、管理和扩展,让其经历从测试到生产的整个开发生命周期,深入了解Docker适用于什么场景。并且这本Docker的学习权威指南介绍了其组件的基础知识,然后用Docker构建容器和服务来完成各种任务:利用Docker为新项目建立测试环境,演示如何使用持续集成的工作流集成Docker,如何构建应用程序服务和平台,如何使用Docker的API,如何扩展Docker。

总共包含了:简介、安装Docker、Docker入门、使用Docker镜像和仓库、在测试中使用Docker、使用Docker构建服务、使用Fig编配Docke、使用Docker API、获得帮助和对Docker进行改进等9个章节的知识。

image

image

image

image

关于阿里内部都在强烈推荐使用的“K8S+Docker学习指南”—《深入浅出Kubernetes:理论+实战》、《权威指南-第一本Docker书》,看完之后两个字形容,爱了爱了!

务、使用Fig编配Docke、使用Docker API、获得帮助和对Docker进行改进等9个章节的知识。

[外链图片转存中…(img-ZkCOKpKT-1714625882905)]

[外链图片转存中…(img-J0gabo5t-1714625882906)]

[外链图片转存中…(img-ASSXJkpt-1714625882906)]

[外链图片转存中…(img-ROWQNFR6-1714625882906)]

关于阿里内部都在强烈推荐使用的“K8S+Docker学习指南”—《深入浅出Kubernetes:理论+实战》、《权威指南-第一本Docker书》,看完之后两个字形容,爱了爱了!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 24
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值