原创: 架构师进阶 优知学院 5天前

 很多只知道高并发,却不知道高并发与多线程的关系,以及真正的高并发应该如何设计技术方案

01

什么是高并发

高并发(High Concurrency)是一种系统运行过程中遇到的一种“短时间内遇到大量操作请求”的情况,主要发生在web系统集中大量访问收到大量请求(例如:12306的抢票情况;天猫双十一活动)。该情况的发生会导致系统在这段时间内执行大量操作,例如对资源的请求,数据库的操作等。

02

高并发的处理指标

高并发相关常用的一些指标有:

1.响应时间(Response Time)

响应时间:系统对请求做出响应的时间。例如系统处理一个HTTP请求需要200ms,这个200ms就是系统的响应时间

2.吞吐量(Throughput)

吞吐量:单位时间内处理的请求数量。

3.每秒查询率QPS(Query Per Second)

QPS:每秒响应请求数。在互联网领域,这个指标和吞吐量区分的没有这么明显。

4.并发用户数

并发用户数:同时承载正常使用系统功能的用户数量。例如一个即时通讯系统,同时在线量一定程度上代表了系统的并发用户数。

03

高并发与多线程的关系区别

“高并发和多线程”总是被一起提起,给人感觉两者好像相等,实则 高并发 ≠ 多线程

1.多线程

多线程是java的特性,因为现在cpu都是多核多线程的,可以同时执行几个任务,为了提高jvm的执行效率,java提供了这种多线程的机制,以增强数据处理效率。多线程对应的是cpu,高并发对应的是访问请求,可以用单线程处理所有访问请求,也可以用多线程同时处理访问请求。

在过去单CPU时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个CPU,并交由操作系统来完成多任务间对CPU的运行切换,以使得每个任务都有机会获得一定的时间片运行。

再后来发展到多线程技术,使得在一个程序内部能拥有多个线程并行执行。一个线程的执行可以被认为是一个CPU在执行该程序。当一个程序运行在多线程下,就好像有多个CPU在同时执行该程序。

总之,多线程即可以这么理解:多线程是处理高并发的一种编程方法,即并发需要用多线程实现。

2.高并发

高并发不是JAVA的专有的东西,是语言无关的广义的,为提供更好互联网服务而提出的概念。

典型的场景,例如:12306抢火车票,天猫双十一秒杀活动等。该情况的发生会导致系统在这段时间内执行大量操作,例如对资源的请求,数据库的操作等。如果高并发处理不好,不仅仅降低了用户的体验度(请求响应时间过长),同时可能导致系统宕机,严重的甚至导致OOM异常,系统停止工作等。

如果要想系统能够适应高并发状态,则需要从各个方面进行系统优化,包括,硬件、网络、系统架构、开发语言的选取、数据结构的运用、算法优化、数据库优化等……而多线程只是其中解决方法之一。

04

多线程的并发技术

java多线程编程将会涉及到如下技术点:

1.并发编程三要素

  • 原子性原子,即一个不可再被分割的颗粒。在Java中原子性指的是一个或多个操作要么全部执行成功要么全部执行失败。

  • 有序性程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行重排序)

  • 可见性当多个线程访问同一个变量时,如果其中一个线程对其作了修改,其他线程能立即获取到最新的值。

2. 线程的五大状态

  • 创建状态当用 new 操作符创建一个线程的时候

  • 就绪状态调用 start 方法,处于就绪状态的线程并不一定马上就会执行 run 方法,还需要等待CPU的调度

  • 运行状态CPU 开始调度线程,并开始执行 run 方法

  • 阻塞状态线程的执行过程中由于一些原因进入阻塞状态比如:调用 sleep 方法、尝试去得到一个锁等等

  • 死亡状态run 方法执行完 或者 执行过程中遇到了一个异常

3.悲观锁与乐观锁

  • 悲观锁:每次操作都会加锁,会造成线程阻塞。

  • 乐观锁:每次操作不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止,不会造成线程阻塞。

4.线程之间的协作:wait/notify/notifyAll等

5.synchronized 关键字

6.CAS

CAS全称是Compare And Swap,即比较替换,是实现并发应用到的一种技术。操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。 如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值 。否则,处理器不做任何操作。

7.线程池

如果我们使用线程的时候就去创建一个线程,虽然简单,但是存在很大的问题。如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。线程池通过复用可以大大减少线程频繁创建与销毁带来的性能上的损耗。

05

高并发的系统解决方案

1.分布式缓存:redis、memcached等,结合CDN来解决图片文件等访问。

2.消息队列中间件:activeMQ等,解决大量消息的异步处理能力。

3.应用拆分:一个工程被拆分为多个工程部署,利用dubbo解决多工程之间的通信。

4.数据库垂直拆分和水平拆分(分库分表)等。

5.数据库读写分离,解决大数据的查询问题。

6.还可以利用nosql ,例如mongoDB配合mysql组合使用。

7.还需要建立大数据访问情况下的服务降级以及限流机制等。

阿里P8架构师谈:高并发与多线程的关系、区别、以及高并发的系统解决方案相关推荐

  1. 阿里P8架构师谈:高并发网站的监控系统选型、比较、核心监控指标

    在高并发分布式环境下,对于访问量大的业务.接口等,需要及时的监控网站的健康程度,防止网站出现访问缓慢,甚至在特殊情况出现应用服务器雪崩等场景,在高并发场景下网站无法正常访问的情况,这些就会涉及到分布式 ...

  2. psql where里有自定义函数慢_阿里P8架构师谈:MySQL慢查询优化、索引优化、以及表等优化总结...

    MySQL优化概述 MySQL数据库常见的两个瓶颈是:CPU和I/O的瓶颈. CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候. 磁盘I/O瓶颈发生在装入数据远大于内存容量的时候,如果应 ...

  3. 阿里P8架构师谈:从单体架构、到SOA、再到微服务的架构设计详解

    本文涉及的内容以及知识点如下: 1.单体架构 2.单体架构的拆分 3.SOA与微服务的区别 4.微服务的优缺点 5.微服务的消息 6.服务集成 7.数据的去中心化 单体架构 Web应用程序发展的早期, ...

  4. 阿里P8架构师谈:流量高峰时期的性能瓶颈有哪些、以及如何来解决

    在高并发大量用户的场景,系统一般会面临如下三个挑战: 1. 日益增长的用户数量 2. 日渐复杂的业务 3. 急剧膨胀的数据 这些挑战对于性能优化而言表现为:在保持和降低系统TP95响应时间(指的是将一 ...

  5. 阿里P8架构师谈:Zookeeper的原理和架构设计,以及应用场景

    什么是 Zookeeper Zookeeper 分布式服务框架是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如: 统一命名服务 状态同步服务 集群 ...

  6. 阿里P8架构师谈:微服务Dubbo和SpringCloud架构设计、优劣势比较

    本文主要围绕微服务的技术选型.通讯协议.服务依赖模式.开始模式.运行模式等几方面来综合比较Dubbo和Spring Cloud 这2种开发框架.架构师可以根据公司的技术实力并结合项目的特点来选择某个合 ...

  7. 阿里P8架构师谈:Web前端、应用服务器、数据库SQL等性能优化总结

    web前端性能优化 Web前端指网站业务逻辑之前的部分,包括: 1.浏览器加载 2.网站视图模型 3.图片服务 4.CDN服务等 主要优化手段有优化浏览器访问,使用反向代理,CDN等. 1.浏览器访问 ...

  8. 阿里P8架构师谈:多线程、架构、异步消息、Redis等性能优化策略

    常见性能优化策略分类 1.代码 之所以把代码放到第一位,是因为这一点最容易引起技术人员的忽视.很多技术人员拿到一个性能优化的需求以后,言必称缓存.异步.JVM等.实际上,第一步就应该是分析相关的代码, ...

  9. 阿里P8架构师谈:分布式事务的解决方案,以及原理、总结

    分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,特别是在这几年越来越火的微服务架构中,几乎可以说是无法避免,本文就围绕分布式事务各方面与大家进行介绍. 事务 1. ...

  10. 阿里P8架构师谈:分布式系统全局唯一ID简介、特点、5种生成方式

    什么是分布式系统唯一ID 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识. 如在金融.电商.支付.等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据 ...

最新文章

  1. Android 数据库 ANR的例子
  2. 一次给女朋友转账引发我对分布式事务的思考
  3. iphone导出通讯录到安卓_如何把旧手机的便签数据转移到新的iPhone手机上?
  4. 兴义智力象机器人_兴义向阳路小学在第十八届全国青少年机器人竞赛贵州区选拔赛夺冠...
  5. MOCTF-Web-我想要钱
  6. sprintboot 配置文件上传大小(默认是1MB)
  7. 用XenoCode 2006 加密dll(.NET
  8. 不下载APP就不能看全文?工信部出手了...
  9. Asp.Net 导出数据格式为Excel 数据的9种方案
  10. 06-人脸识别-MTCNN的感性认识(转载)
  11. JQuery的Alert插件介绍
  12. 关于margin的数值是百分比,参照对象
  13. Linux命令之文本分析工具awk
  14. dwg格式的计算机图,电脑上怎么打开dwg文件?
  15. python写诗代码_python实现诗歌游戏(类继承)
  16. Python 经典学习资料收集
  17. TI-C2000-捕获模块ECAP应用-以欧姆龙E6B2-CWZ6C测速编码器为例
  18. 深入line-height,中线,基线,底线,顶线
  19. 如何处理Java异常及常见异常
  20. Every-SG游戏

热门文章

  1. 2021年绵阳东辰中学高考成绩查询,2021年绵阳高考状元是谁分数多少分,历年绵阳高考状元名单...
  2. PTA L1-005 考试座位号(详解)
  3. 五.UMLet的使用与类图的设计
  4. vue仿京东放大镜加商品缩略图轮播组件
  5. R中的直方图和核密度图绘制
  6. 关于IE不能打开 windows updates 页 / 看不见版本号的解决
  7. c# wpf 试题_C#/WPF 面试题(Microsoft, Morgan stanley)
  8. 微信小程序之商城分类详情
  9. 有一种游戏(从妄撮谈起)
  10. 年终反思 -- 系统学习心理学之后对学习生活的感悟【再见2022,你好2023】