• 震感来袭,豆瓣评分9.9,万人血书的多线程与高并发v2.0版本


    蓦然回首自己做开发已经十年了,这十年中我获得了很多,技术能力、培训、出国、大公司的经历,还有很多很好的朋友。但再仔细一想,这十年中我至少浪费了五年时间,这五年可以足够让自己成长为一个优秀的程序员,可惜我错过了,我用这五年时间和很多程序员一样在困惑和迷茫中找不到出路!

    路其实一直都在那里,只是我们看不到而已!

    以前我一直被公司和技术牵着走,并不是自己在选择技术,而是不自觉地被推到了这个位置上。想想有多少人对于自己将来要从事的职业和技术类型进行过深入思考和比较呢?当我跳出编码后,我开始思考和程序及程序员职业生涯相关的问题,最后发现,影响我们走入今天的困局的竟然是一些我们常常挂在嘴边的话。

    一、什么是高并发
    高并发(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在同时执行该程序。
    总之,多线程即可以这么理解:多线程是处理高并发的一种编程方法,即并发需要用多线程实现。

    不论是实际工作需要还是为了应付面试,掌握多线程都是程序员职业生涯中一个必须经过的环节。

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

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

    以上的内容都整合进了这份手册,该手册共分为九个章节,从多线程入门:它的基本概念,到面试题剖析,再到深入线程池源码来理解多线程,深度掌握。

    由于内容过多无法一一展示,感兴趣的朋友可以转发+关注,私信暗号:“666”即可免费入手一份

    第一节:线程的基本概念

    • 基本概念
    • 创建线程的几种方式
    • 认识几个线程的方法
    • 线程状态
    • synchronized
    • synchronized的底层实现
    • 内容回顾

    第二节:volatile与CAS

    • volatile作用
    • 保证线程的可见性
    • 禁止指令重新排序
    • ABA问题
    • Unsafe

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

    • 为什么Atomic要比Sync快?
    • LongAdder为什么要比Atomicx效率要高呢?
    • 间歇性复习
    • ReentrantLock
    • CyclicBarrier
    • Phaser
    • ReadWriteLock
    • Semaphore
    • Exchanger

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

    • LockSupport
    • LockSupport中parkQ和unpark0方法的实现原理
    • 淘宝面试题
    • 源码阅读技巧和AQS源码结构解析
    • 阅读源码的原则
    • AQS源码解析

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

    • 通过ReentrantLock来解读AQS源码
    • 通过AQS是如何设置链表尾巴的来理解AQS为什么效率这么高
    • 为什么是双向链表?
    • VarHandle
    • ThreadLocal
    • ThreadLocal源码
    • 为什么要用ThreadLocal?
    • Java的四种引用:强软弱虚

    第六节:并发容器

    • Hashtable - CHM
    • HashMap
    • SynchronizedHashMap
    • ConcurrentHashMap
    • From Vector To Queue
    • ArrayList
    • Vector
    • LinkedList
    • Queue
    • ConcurrentMap
    • CopyOnWrite
    • BlockingQueue
    • LinkedBlockingQueue
    • ArrayBlockingQueue
    • DelayQueue
    • SynchronousQueue
    • TransferQueue

    第七节:线程池

    • corePoolSoze核心线程数
    • maximumPoolSize最大线程数
    • keepAliveTime生存时间
    • TimeUnit.SECONDS生存时间的单位
    • 任务队列
    • 线程工厂defaultThreadFactory
    • 拒绝策略

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

    • SingleThreadPool
    • CachedPool
    • FixedThreadPool
    • Cache vs Fixed
    • ScheduledPool
    • ThreadPoolExecutor源码解析
    • 构造方法
    • 提交执行task的过程
    • addWorker源码解析
    • 线程池worker任务单元
    • 核心线程执行逻辑-runworker
    • WorkStealingPool
    • ForkJoinPool

    第九节:JMH与Disruptor

    • JMH Java准测试工具套件
    • Disruptor开发步骤
    • ProducerType生产者线程模式
    • 消费者异常处理

    多线程和高并发这两大块,这两大块是现在面试问得越来越多,也是相对一个初级的程序员向中高级迈进的必须要踏过的一个坎。

  • 相关阅读:
    maven下载、本地仓库设置与idea内置maven设置
    14-多线程1
    第0讲 课程介绍
    【Java】JavaFx桌面编程整理
    React ts学习重点(组件状态,Hooks,路由)
    ECS框架浅析
    利用倒序和find()来找出待查找字符的最大下标
    如何在Room框架下注册onUpgrade回调及自定义DatabaseErrorHandler
    关于虚数与复数
    端到端可追溯性在产品开发中有哪些好处
  • 原文地址:https://blog.csdn.net/shy111111111/article/details/127703320