乐趣区

关于java:高并发与多线程

一、什么是高并发

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

二、高并发的解决指标

高并发相干罕用的一些指标有:响应工夫、吞吐量、每秒查问率 QPS、并发用户数
1、响应工夫(Response Time)

响应工夫:系统对申请做出响应的工夫。例如零碎解决一个 HTTP 申请须要 200ms,这个 200ms 就是零碎的响应工夫

2、吞吐量(Throughput)

吞吐量:单位工夫内解决的申请数量。

3、每秒查问率 QPS(Query Per Second)

QPS:每秒响应申请数。在互联网畛域,这个指标和吞吐量辨别的没有这么显著。

4、并发用户数

并发用户数:同时承载失常应用零碎性能的用户数量。例如一个即时通讯零碎,同时在线量肯定水平上代表了零碎的并发用户数。

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

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

3.1、多线程

  • 多线程是 Java 的个性,因为当初 cpu 都是多核多线程的,能够同时执行几个工作,为了进步 jvm 的执行效率,Java 提供了这种多线程的机制,以加强数据处理效率。
  • 多线程对应的是 cpu,高并发对应的是拜访申请,能够用单线程解决所有拜访申请,也能够用多线程同时解决拜访申请。
  • 在过来单 CPU 时代,单任务在一个工夫点只能执行繁多程序。之后倒退到多任务阶段,计算机能在同一时间点并行执行多任务或多过程。尽管并不是真正意义上的“同一时间点”,而是 多个工作或过程共享一个 CPU,并交由操作系统来实现多任务间对 CPU 的运行切换,以使得每个工作都有机会取得肯定的工夫片运行
  • 起初倒退到多线程技术,使得在一个程序外部能领有多个线程并行执行。一个线程的执行能够被认为是一个 CPU 在执行该程序。当一个程序运行在多线程下,就如同有多个 CPU 在同时执行该程序。
  • 总之,多线程即能够这么了解:多线程是解决高并发的一种编程办法,即并发须要用多线程实现。

3.2、高并发

  • 高并发不是 JAVA 的专有的货色,是语言无关的狭义的,为提供更好互联网服务而提出的概念。典型的场景,例如:12306 抢火车票,天猫双十一秒杀流动等。
  • 该状况的产生会导致系统在这段时间内执行大量操作,例如对资源的申请,数据库的操作等。如果高并发解决不好,不仅仅升高了用户的体验度(申请响应工夫过长),同时可能导致系统宕机,重大的甚至导致 OOM 异样,零碎进行工作等

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

四、多线程并发技术

Java 多线程编程将会波及到如下技术点:
1、并发编程三要素 (volatile)
原子性 :即一个不可再被宰割的颗粒。在 Java 中原子性指的是一个或多个操作要么全副执行胜利要么全副执行失败。
有序性 :程序执行的程序依照代码的先后顺序执行。(处理器可能会对指令进行重排序)
可见性 :当多个线程拜访同一个变量时,如果其中一个线程对其作了批改,其余线程能立刻获取到最新的值。
2、线程的五大状态

创立状态 :当用 new 操作符创立一个线程的时候
就绪状态 :调用 start 办法,处于就绪状态的线程并不一定马上就会执行 run 办法,还须要期待 CPU 的调度
运行状态 :CPU 开始调度线程,并开始执行 run 办法
阻塞状态 :线程的执行过程中因为一些起因进入阻塞状态比方:调用 sleep 办法、尝试去失去一个锁等等
死亡状态 :run 办法执行完 或者 执行过程中遇到了一个异样
具体线程申明周期图:

3、乐观锁与乐观锁
乐观锁 :每次操作都会加锁,会造成线程阻塞(synchronized)。
乐观锁 :每次操作不加锁而是假如没有抵触而去实现某项操作,如果因为抵触失败就重试,直到胜利为止,不会造成线程阻塞。
4、线程之间的合作
线程间的合作有:wait/notify/notifyAll/Condition/Lock 等
5、synchronized 关键字
synchronized 是 Java 中的关键字,是一种同步锁。它润饰的对象有以下几种:
1)、 润饰一个代码块 :被润饰的代码块称为同步语句块,其作用的范畴是大括号{} 括起来的代码,作用的对象是调用这个代码块的对象
2)、 润饰一个办法 :被润饰的办法称为同步办法,其作用的范畴是整个办法,作用的对象是调用这个办法的对象
3)、 批改一个动态的办法 :其作用的范畴是整个静态方法,作用的对象是这个类的所有对象
4)、 批改一个类:其作用的范畴是 synchronized 前面括号括起来的局部,作用主的对象是这个类的所有对象。
6、CAS
CAS 全称是Compare And Swap,即比拟替换,是实现并发利用到的一种技术。操作蕴含三个操作数—内存地位(V)、预期原值(A)和新值(B)。如果内存地位的值与预期原值相匹配,那么处理器会主动将该地位值更新为新值。否则,处理器不做任何操作。
CAS 存在三大问题:

  • ABA 问题(AtomicReference);
  • 循环工夫长开销大;
  • 以及只能保障一个共享变量的原子操作(AtomicInteger、Unsafe);

7、线程池
如果咱们应用线程的时候就去创立一个线程,尽管简略,然而存在很大的问题。如果并发的线程数量很多,并且每个线程都是执行一个工夫很短的工作就完结了,这样频繁创立线程就会大大降低零碎的效率,因为频繁创立线程和销毁线程须要工夫。线程池通过复用能够大大减少线程频繁创立与销毁带来的性能上的损耗。

五、高并发技术解决方案

5.1、怎么进步零碎的高并发能力?

1、动态资源联合 CDN(Content Delivery Network)来解决图片文件等拜访
2、分布式缓存:redis、memcached 等。
3、音讯队列中间件:rocketMq、activeMQ、kafka 等,解决大量音讯的异步解决能力。
4、利用拆分: 一个工程被拆分为多个工程部署,利用 RPC(微服务) 解决多工程之间的通信。
5、数据库垂直拆分和程度拆分 (分库分表) 等。
6、数据库读写拆散,解决大数据的查问问题。
7、利用 nosql,例如 mongoDB 配合 mysql 组合应用。
8、建设大数据拜访状况下的服务降级以及限流机制等。

退出移动版