• 还有人以为高并发=多线程吗?跟着大佬带你了解二者关系与区别,面试难题轻松拿下!


    高并发和多线程的关系

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

    多线程是完成任务的一种方法,高并发是系统运行的一种状态,通过多线程有助于系统承受高并发状态的实现。

    高并发是一种系统运行过程中遇到的一种“短时间内遇到大量操作请求”的情况,主要发生在web系统集中大量访问或者socket端口集中性收到大量请求(例如:12306的抢票情况、天猫双十一活动)。该情况的发生会导致系统在这段时间内执行大量操作,例如对资源的请求,数据库的操作等。如果高并发处理不好,不仅仅降低了用户的体验度(请求响应时间过长),同时可能导致系统宕机,严重的甚至导致OOM异常,系统停止工作等。如果要想系统能够适应高并发状态,则需要从各个方面进行系统优化,包括,硬件、网络、系统架构、开发语言的选取、数据结构的运用、算法优化、数据库优化……而多线程只是其中解决方法之一。

    实现高并发需要考虑:

    系统的架构设计,如何在架构层面减少不必要的处理(网络请求、数据库操作等)
    网络拓扑优化减少网络请求时间、如何设计拓扑结构、分布式如何实现?
    系统代码级别的代码优化,使用什么设计模式来进行工作?哪些类需要使用单例?哪些需要尽量减少new操作?
    提高代码层面的运行效率、如何选取合适的数据结构来进行数据存取?如何设计合适的算法?
    任务执行方式级别的同异步操作,在哪里使用同步?哪里使用异步?
    数据库优化减少查询修改时间。数据库的选取?数据库引擎的选取?数据库表结构的设计?数据库索引、触发器等设计?是否使用读写分离?还是需要考虑使用数据仓库?
    缓存数据库的使用?如何选择缓存数据库?是redis还是memcache?如何设计缓存机制?
    数据通信问题,如何选择通信方式?是使用TCP还是UDP?是使用长连接还是短连接?NIO还是BIO?netty、mina还是原生socket?
    操作系统选取,使用winserver还是linuc?或者unix?
    硬件配置?是8G内存还是32G,网卡10G还是1G?
    ……
    ……
    以上的这些问题在高并发中都是必须深入考虑的,就像木桶原理一样,只要其中的某一方面没有考虑到,都会造成系统瓶颈,影响整个系统的运行。而高并发问题不仅仅涉及面广,同时又要求有足够的深度!

    而多线程在这里只是在同/异步角度解决高并发问题的其中的一个手段,是在同一时刻利用计算机闲置资源的一种方式。

    多线程在解决高并发问题中所起到的作用就是使计算机的资源在每一时刻都能达到最大的利用率,不至于浪费计算机资源使其闲置。

    高并发系统,多线程涉及到大量的概念和知识点,如果没有系统的学习,很容易会杂糅概念而辨识不清,在面试与实际工作中都会遇到困难。这些知识点,可以按照以下的多线程高并发的文档以及知识体系导图系统性的学习,如需要参照进行学习可以三连支持一下

    整份文档共九个章节

    第一节:线程的基本概念

    多线程与高并发大概讲六大块,

    • 第一:基本的概念,从什么是线程开始
    • 第二:JUC同步工具,就是各种同步锁态
    • 第三:同步容器
    • 第四:线程池
    • 第五:高频面试加分项的- -些面试用的东西,包括线程
    • 第六: Disruptor ,不知道有多少同学听说过这个框架的,这个框架它也是一个MQ框架( Message Queue )叫做消息队列,消息队列非常多,后面还会给大家讲Kafka、RabbitMQ ,Redis等这些都是消息队列。Disruptor是目前大家公认的在单机环境上效率最高的、性能最快的MQ.

    第二节: volatile与CAS

    • volatile
    • CAS

    第三节: Atomic类和线程同步新机制

    一个Atomic的问题 ,然后开始讲除synchronized之外的别的锁。

    第四节: LockSupport. 淘宝面试题与源码阅读方法论

    本章我们补一个小漏洞,它叫LockSupport ,然后我们分析两道面试题,紧接着我会教大家阅读源码的技巧,源码层出不穷,生生不息,掌握了源码的阅读技巧,大家培养出了阅读源码兴趣的时候,之后好多代码,你需要自己去抠,抠出来才是你自己的,最后我们会分析AQS源码

    第五节: AQS源码阅读与强软弱虚4种引用以及ThreadLocal原理与源码

    今天咱们继续讲AQS的源码,在上节课我教大家怎么阅读AQS源码,跑不起来的不读、解决问题就好。目的性一条线索到底、无关细节略过,读源码的时候应该先读骨架,比如拿AQS来说,你需要了解AQS是这么一个数据结构,你读源码的时候读起来就会好很多

    第六节:并发容器

    第七节:线程池

    这道面试题呢实际上是华为的一道面试题,其实它里面是一道填空题,后来就很多的开始考这道题,这个面试题是两个线程。第一个线程是从1到26, 第二个线程是从A到一直到Z ,然后要让这两个线程做到同时运行,交替输出。顺序打印。那么这道题目的解法有非常多。

    第八节:线程池与源码阅读

    • 线程池worker任务单元
    • 核心线程执行逻辑-runworker

    第九节: JMH与Disruptor

    • JMH Java准测试工具套件
    • 什么是JMH
    • 创建JMH测试

  • 相关阅读:
    内网渗透-内网信息收集
    WPF 属性触发器示例
    重磅!2022最新SCI影响因子发布,三大名刊NCS及国内期刊TOP10排名有变化(内附2022年最新影响因子)
    安卓/iOS/Linux系统影音边下边播P2P传输解决方案
    衔尾法解决当无法使用空闲中断以及DMA中断时配置DMA接收串口不定长数据
    消息中间件篇之Kafka-消费顺序性
    .Net 锁的介绍
    【UE】纯蓝图实现:在游戏运行时设置关键点,然后让actor沿着关键点移动
    Java设计模式-抽象工厂模式
    java高级编程day23【谷】
  • 原文地址:https://blog.csdn.net/LBWNB_Java/article/details/128011555