文档章节

高并发与多线程的关系、区别、高并发的技术方案

路程
 路程
发布于 03/05 17:01
字数 1848
阅读 128
收藏 1

什么是高并发?

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

高并发的处理指标?

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

1.响应时间(Response Time)

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

2.吞吐量(Throughput)

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

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

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

4.并发用户数

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

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

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

1.多线程

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

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

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

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

2.高并发

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

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

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

多线程并发技术

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.线程池

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

高并发技术方案:提高高并发能力

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

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

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

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

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

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

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

本文转载自:http://youzhixueyuan.com/high-concurrency-and-multithreading-high-concurrency-technical-solutions...

路程

路程

粉丝 4
博文 10
码字总数 4054
作品 0
西安
程序员
私信 提问
[高并发Java 八] NIO和AIO

IO感觉上和多线程并没有多大关系,但是NIO改变了线程在应用层面使用的方式,也解决了一些实际的困难。而AIO是异步IO和前面的系列也有点关系。在此,为了学习和记录,也写一篇文章来介绍NIO和...

Hosee
2016/02/15
12.3K
6
阿里蚂蚁金服五面,血与泪的经验总结(附面试答案)

蚂蚁金服一面:分布式架构 50分钟 个人介绍加项目介绍20分钟 微服务架构是什么,它的优缺点? ACID CAP BASE理论 分布式一致性协议,二段、三段、TCC,优缺点 RPC过程 服务注册中心宕机了怎么...

别打我会飞
2018/12/23
0
0
实在找不到学oracle和用oracle的理由

互联网应用的一大特点就是对数据的实时性要求不高。 如果需要高效的查询,有专用的全文检索,如lucene,秒杀oracle和任何商业的关系数据库。 对实时性要求不高,决定了可以充分的利用缓存,页...

大东哥
2011/07/16
650
9
如何提高Java并行程序性能

在Java程序中,多线程几乎已经无处不在。与单线程相比,多线程程序的设计和实现略微困难,但通过多线程,我们却可以获得多核CPU带来的性能飞跃,从这个角度说,多线程是一种值得尝试的技术...

吴小编
2015/11/24
171
2
你分得清分布式、高并发与多线程吗?

当提起这三个词的时候,是不是很多人都认为分布式=高并发=多线程? 当面试官问到高并发系统可以采用哪些手段来解决,或者被问到分布式系统如何解决一致性的问题,是不是一脸懵逼? 确实,在一开...

Java干货分享
2018/12/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

PostgreSQL如何实现跨平台代码

我们知道,PostgreSQL可以支持几乎(这个词似乎可以不要)所有主流平台,平台间尤其Windows与*nix之间的API差异巨大,PG是怎么做到的呢,用一个简单的例子解释。 前边我写怎么在Windows下编译...

有理想的猪
32分钟前
5
0
隐私政策声明

服务协议及隐私政策 为使用应用【随手记账本】(安卓包名:com.th.bk 以下简称“本软件”)服务,“厦门量子堆栈科技有限公司”以下简称“本公司”,除非你已阅读并接受本协议所有条款,否则...

Gemini-Lin
43分钟前
17
0
IT兄弟连 Java语法教程 流程控制语句 循环结构语句2

双重for循环 如果把一个循环放在另一个循环体中,那么就可以形成嵌套循环,也就是双重for循环,当然嵌套循环也可以是for循环嵌套while循环,也可以是while循环嵌套while循环……,即各种类型...

老码农的一亩三分地
48分钟前
15
0
访问LNMP虚拟主机出现报错:No input file specified.

之前一直是使用lnmp一键包,但是访问创建的虚拟主机,并没有出现过的错误:No input file specified. 网上的文章很多,但是都是转载,而且原因也很多,根本不适用 后面在lnmp一键包官网找到解...

wenzhizhong
今天
13
0
OSChina 周三乱弹 —— 你还能管得住观众愿意看谁吗

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享李宗盛的单曲《凡人歌 (电视剧《碧海情天》主题曲)》:你我皆凡人,生在人世间#今日歌曲推荐# 《凡人歌 (电视剧《碧海情天》主...

小小编辑
今天
1K
21

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部