Java高并发与多线程理解
容易搞混这两个慨念做一下笔记,当然这是我个人一点理解,觉得不对、错误的略过或者留言一起讨论。
-
并发
顾名思义就是一起行动。
比如你在打游戏,突然接到电话,这时你可以再接电话再继续打游戏,这叫并发。
但是如果你只能打完游戏才能接电话这叫非并发 ,也就是串行。
所以并发是指处理多任务的能力,当你一件事接着一件事进行的时候就是串行,多件事一起进行的时候就是并发。 -
并行
还是这个例子,你一边接电话一边打游戏就是并行。
并行的基础就是多线程(下面会讲)
-
同步和异步
同步就是一个方法执行,必须等这个方法结束才能执行下一步。
同步主要用于上下有递进关系的代码,特点是有序,串行执行,逻辑简单,但是执行效率较低。
异步指当一个方法执行,不必等这个方法执行结束就直接执行后面的程序(调用即返回)
异步主要使用线程,逻辑复杂,执行效率高容易出问题 -
高并发
通俗来讲,多线程可以认为是高并发的一种表现形式或者解决方案,所以在讲多线程之前,我们先讲高并发。
高并发,指的是一个系统,在短时间内,收到大量操作请求的情况。
这种情况,一般而言主要发生在web系统中,比如:淘宝双十一,抖音某明星传出绯闻等等。
常用的几个指标 -
响应时间(Response Time)
系统对请求作出的响应时间(一个请求从请求发出到请求结束的时间) -
吞吐量(Throughput)
单位时间内处理的请求数量 -
每秒查询率QPS(Query Per Second)
每秒响应请求数。(其实与吞吐量指向同一个指标) -
并发用户数
同时承载正常使用系统功能的用户数量。
注意一点
高并发和多线程之间并不能划等号,多线程只是高并发在应用代码层面的一种解决方案,然而一般情况下,高并发还需要系统架构,硬件设施,网络等多方面的调优协助完成。
- 雪崩效应
在密码学中,雪崩效应(Avalanche effect)指加密算法(尤其是块密码和加密散列函数)的一种理想属性。
雪崩效应是指当输入发生最微小的改变(例如,反转一个二进制位)时,也会导致输出的剧变(如,输出中一半的二进制位发生反转)。
服务雪崩效应是一种因"服务提供者的不可用"(原因)导致"服务调用者不可用"(结果),并将不可用逐渐放大的现象。
服务雪崩的过程可以分为三个阶段:
(1)服务提供者不可用;
(2)重试加大请求流量;
(3)服务调用者不可用;
如何避免呢?
横向扩充服务
限流
熔断
4.高并发的处理
(1)缓存(cache)
把常用数据存储到可以快速获取的区域(缓存区),以便重复利用,提高效率。
例如:从内存中读取数据时,先将常用的数据存放到缓存区,硬盘直接从缓存区读取。
!在这地地方我们要注意:
我们平时所说的缓冲(buffer),和缓存不是同一回事,缓冲指的是在数据流转过程中,不同层次数据速度不一致时,利用缓冲区来缓解上下层之间速度问题,增加速度。
例如:将数据写入到内存时,先写入缓冲区,内存则直接从缓冲区中读取写入,减少IO次数,增加速度,降低对磁盘的损耗。
不过他们本质上都是为了提高效率。
(2)降级
当服务出现问题或影响到核心流程时,需要暂时屏蔽掉,待高峰过后或问题解决后再打开;
(3)限流
限流是高并发里面最重要也是最复杂的方法,当不可降级场景出现时,需要采用限流限制该场景的并发请求,有损服务而不是不服务。
通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级。
超过阈值时策略:
定向到错误页或告知没有资源
返回兜底数据或默认数据,如商品详情页库存默认有货
常见限流场景:
线程池
数据库连接池
并发请求数
接口调用速率
MQ的消费速率
常见限流算法:
令牌桶:一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌,请求获取令牌,令牌不足时拒绝请求。
漏桶:流入速率过快,超过桶的容量,拒绝请求。
计数器(简单粗暴):当请求超过计数时,拒绝请求。
(4)熔断
降级往往代表系统功能部分不可用,熔断代表的是完全不可用。
降级一般是客户端处理,熔断是在服务端处理的。
服务熔断一般是指软件系统中,由于某些原因使得服务出现了过载现象,为防止造成整个系统故障,从而采用的一种保护措施,所以很多地方把熔断亦称为过载保护。
5.进程
什么叫进程?通俗来说就是一个正在运行的程序。比如QQ、微信、王者荣耀啊等等。
线程主要的特性:
(1)独立性
进程是系统中独立存在的实体,它拥有自己独立的资源和自己私有的地址空间。
进程之间不可以直接访问资源和地址空间。
(2)动态性
程序(App)是一个静态的指令集和,进程是一个正在执行中的指令集合,进程拥有自己的生命周期和不同的生命形态。
(3)并发性
多个进程可以在单个处理器上并发执行,不会相互受到影响。(主要是依赖于线程和时间片)
一个进程里面可以由单个或者多个线程协同 完成任务。
6.多线程
说这个之前先说一下线程,线程的教科书说法:操作系统能够进行运算调度的最小单元
学过操作系统的都知道,对单核cpu来说同时是只能运行一个任务的,也就是说,同时只能跑一个线程,这样就发挥不了cpu强大的计算能力,于是呢就引入了时间片这个概念。
时间片?
CPU给每个线程分配了一部分时间去运行,虽然CPU同时只能运行一个线程,但是我们进行线程的快速切换之后,可以模拟出一个CPU同时运行多个线程的场景(其实主要还是CPU太快了),这样的话可以充分利用CPU计算速度快的优势。时间片的计算方式有好几种,感兴趣的可以自行百度,这里就不过多赘述。
那么什么是多线程呢?
多线程指的是,在单个程序(或者进程)里面,可以运行多个不同的线程,执行不同的任务,最终完成整个程序的运行逻辑。
这里需要注意的是,线程是进程的子集,不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。
别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据
最后总结呢就是:
一个进程可以有多个线程,但是一个线程只有一个父进程;
线程可以拥有自己的堆栈,程序计数器以及局部变量,但是不拥有系统资源。
相关文章
- JAVA多线程和并发基础面试问答
- Java实现 LeetCode 91 解码方法
- Java实现 LeetCode 58 最后一个单词的长度
- Java实现蓝桥杯调和级数
- Java实现 蓝桥杯VIP 算法提高 身份证排序
- java多线程有哪些实际的应用场景?
- 细说Java多线程之内存可见性
- Java开发者值得关注的7款新工具
- java核心知识点学习----多线程并发之线程同步
- Java多线程
- Java多线程--list.parallelStream().forEach()使用实例
- Java 多线程 并发编程
- 【Java语言】几个常见的面试编程题
- Java观察者模式:轻松实现对象间的一对多依赖
- 【蓝桥杯Java_C组·从零开始卷】第三节、while循环&do while循环for循环(超重点)&break终止循环&continue结束本次循环
- 【java】java 多线程编程
- 【Java多线程】内存模型JMM—主内存与工作内存分析
- 借助SimpleDateFormat来谈谈java里的多线程不安全
- Java并发多线程高频面试题
- [转]Java多线程学习(吐血超详细总结)
- java面试题:多线程与并发
- 下载各个版本java (Java Development Kit)
- 【JAVA面试必会】JMM高并发详解(java内存模型、JMM三大特征、volatile关键字 )
- Java:openjdk: error: Student is abstract; cannot be instantiated;java编译环境
- 【多线程】Java中是如何保证多线程间的数据共享的?
- 【java】Java并发编程--Java实现多线程的4种方式