多线程和高并发的关系和区别
“高并发和多线程”总是被人一起提起,给人感觉两者好像相等,实则 高并发 ≠ 多线程
多线程
多线程是Java的特性,因为现在cpu都是多核多线程的,可以同时执行几个任务,为了提高jvm的执行效率,Java提供了这种多线程的机制,以增强数据处理效率。多线程对应的是cpu,高并发对应的是访问请求,可以用单线程处理所有访问请求,也可以用多线程同时处理访问请求。
在过去单CPU时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个CPU,并交由操作系统来完成多任务间对CPU的运行切换,以使得每个任务都有机会获得一定的时间片运行。
后来发展到多线程技术,使得在一个程序内部能拥有多个线程并行执行。一个线程的执行可以被认为是一个CPU在执行该程序。当一个程序运行在多线程下,就好像有多个CPU在同时执行该程序。
总之,多线程即可以这么理解:多线程是处理高并发的一种编程方法,即并发需要用多线程实现。
高并发
高并发不是JAVA的专有的东西,是语言无关的广义的,为提供更好互联网服务而提出的概念。典型的场景,例如:12306抢火车票,天猫双十一秒杀活动等。该情况的发生会导致系统在这段时间内执行大量操作,例如对资源的请求,数据库的操作等。如果高并发处理不好,不仅仅降低了用户的体验度(请求响应时间过长),同时可能导致系统宕机,严重的甚至导致OOM异常,系统停止工作等。
如果要想系统能够适应高并发状态,则需要从各个方面进行系统优化,包括,硬件、网络、系统架构、开发语言的选取、数据结构的运用、算法优化、数据库优化等……而多线程只是其中解决方法之一。
下面大家可以看一下多线程与高并发的思维脑图,基本上囊括了现阶段面试可以问到的多线程与高并发的所有知识面:
看完脑图之后大家脑子里对多线程与高并发概念有没有更清晰一点呢?如果没有,没关系,下面我会通过两份文档来与大家一起深入了解多线程与高并发。
第一份文档从多线程基础知识讲起。逐步地深入整个Concurrent包。可以让大家对多线程的原理、各种并发的设计原理有一个全面而深刻的理解。
Java并发实现原理(JDK源码剖析)
第1章 多线程基础
- 线程的优雅关闭
- InterruptedException()函数与interrupt()函数
- synchronized关键字
- wait()与notify()
- volatile关键字
- JMM与happen-before
- 内存屏障
- final关键字
- 综合应用:无锁编程
第2章 Atomic类
- AtomicInteger和AtomicLong
- AtomicBoolean和AtomicReference
- AtomicStampedReference和AtomicMarkableReference
- AtomicIntegerFieldUpdater、AtomicLongFieldUpdater和AtomicReferenceFieldUpdater
- AtomicIntegerArray、AtomicLongArray和Atomic-ReferenceArray
- Striped64与LongAdder
第3章 Lock与Condition
- 互斥锁
- 读写锁
- Condition
- StampedLock
第4章 同步工具类
- Semaphore
- CountDownLatch
- CyclicBarrier
- Exchanger
- Phaser
第5章 并发容器
- BlockingQueue
- BlockingDeque
- CopyOnWrite
- ConcurrentLinkedQueue/Deque
- ConcurrentHashMap
- ConcurrentSkipListMap/Set
第6章 线程池与Future
- 线程池的实现原理
- 线程池的类继承体系
- ThreadPoolExector
- Callable与Future
- ScheduledThreadPoolExecutor
- Executors工具类
第7章 ForkJoinPool
- ForkJoinPool用法
- 核心数据结构
- 工作窃取队列
- ForkJoinPool状态控制
- Worker线程的阻塞—唤醒机制
- 任务的提交过程分析
- 工作窃取算法:任务的执行过程分析
- ForkJoinTask的fork/join
- ForkJoinPool的优雅关闭
第8章 CompletableFuture
- CompletableFuture用法
- 四种任务原型
- CompletionStage接口
- CompletableFuture内部原理
- 任务的网状执行:有向无环图
- allOf内部的计算图分析
由于篇幅限制就只能以这种形式展示出来了,需要上面介绍的这份Java并发实现原理(JDK源码剖析)的老哥可以点击此处来获取就可以了!
多线程就先聊到这了,下面我们来聊一聊高并发。高并发这一块咱们来看看一位京东大佬总结的文档。其实,市面上讲述大型分布式架构的文档很多,但基本上都停留在理论和知识的层面,看上去都很对,很“高大上”,但就是落不了地,不能很好地跟实际应用进行结合,从而导致学习的效果欠佳。而这份文档很好地解决了这个问题,不仅深入浅出地讲述了各种保障高可用,以及处理高并发的技术和方案,并理论联系实际,采用京东商品详情页的具体实现这个实际案例,来综合展示了这些技术的应用,从而加深大家的理解和领悟,以更好地把这些技术和方案应用到自己的实际项目中去。
亿级架构
第1部分 概述
- 交易型系统设计的一些原则
第2部分 高可用
- 负载均衡与反向代理
- 隔离术
- 限流详解
- 降级特技
- 超时与重试机制
- 回滚机制
- 压测与预案
第3部分 高并发
- 应用级缓存
- HTTP缓存
- 多级缓存
- 连接池线程池详解
- 异步并发实战
- 如何扩容
- 队列术
第4部分 案例
- 构建需求响应式亿级商品详情页
- 京东商品详情页服务闭环实践
- 使用OpenResty开发高性能Web应用
- 应用数据静态化架构高性能单页Web应用
- 使用OpenResty开发Web服务
- 使用OpenResty开发商品详情页
文档中用到的技术和总结的经验也许无法解决文档中业务场景之外的问题,但这也恰恰是技术的魅力所在。没有一种技术和经验可以作为系统的万能解药来帮助我们一劳永逸地避免掉所有隐患,但我们可以通过对思想的接納和消化来丰富我们的知识体系,让我们成为一个有思想的研发人员。
需要上面这两份文档的老哥可以点击此处来获取就可以了!