Java并发编程的简单理解

目录


文章目录

  • 目录
  • 前言
  • 概念
  • 一、关于高并发大流量
  • 二、扩展
    • 1、Scale-up
    • 2、Scale-out
  • 缓存
  • 异步
  • 总结


前言

高并发系统的演进应该是循序渐进,以解决系统中存在的问题为目的和驱动力的。

所以并不是所有的并发系统设计都要追求高流量,电商对其淘宝那种,IM对齐微信

概念

  • 并发:
    同时拥有两个或者多个线程,如果程序在单核处理器上运行,多个线程交替得换入或者换出内存,这些线程是同时“存在”的,每个线程都处于执行过程中的某个状态,如果运行在多核处理器上,此时,程序中的每个线程都将分配到一个处理器核上,因此可以同时运行

  • 高并发:
    高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,他通常是指,通过设计保证系统能够同时并行处理很多请求

谈并发时:多个线程操作相同的资源,保证线程安全,合理利用资源
谈高并发时:服务能同时处理很多请求(如12306的抢票,天猫双十一的秒杀活动,这会导致系统在短时间内执行大量的操作,
如对资源的请求,数据库的访问),提高程序性能(如果高并发处理不好,不光会导致用户体验不好,还可能会使服务器宕机,出现OOM等)

一、关于高并发大流量

常见的是三种方法:横向扩展、缓存、异步
横向扩展:分而治之是一种常见的高并发系统设计方法,采用分布式部署的方式把流量分流开,让每个服务器都承担一部分并发和流量。
缓存:相当于多拓宽路径来提高系统的性能。
异步:异步处理;先让请求返回,数据准备好后通知请求方。

二、扩展

1、Scale-up

纵向扩展,也就是买性能更好的硬件来提升系统的并发性能

2、Scale-out

通过多个低性能的机器组成一个分布式集群来共同抵御高并发流量的冲击

如果只考虑单机 就无脑纵向扩展,但是大多数情况下我们都会选择横向扩展;包括数据库一主多从、分库分表、存储分片都是它的实际应用方案。

缓存

缓存可以大幅度提升系统的性能呢?

  • 我们知道数据是放在持久化存储中的,一般的持久化存储都是使用磁盘作为存储介质的,而普通磁盘数据由机械手臂、磁头、转轴、盘片组成,盘片又分为磁道、柱面和扇区。
  • 盘片是存储介质,每个盘片被划分为多个同心圆,信息都被存储在同心圆之中,这些同心圆
    就是磁道。在磁盘工作时盘片是在高速旋转的,机械手臂驱动磁头沿着径向移动,在磁道上读取所需要的数据。我们把磁头寻找信息花费的时间叫做寻道时间。
    Java并发编程的简单理解_第1张图片

缓存其实语义很丰富,可以是redis缓存、分布式缓存、本地缓存、CPU缓存等等。

异步

那么什么是同步,什么是异步呢?以方法调用为例,同步调用代表调用方要阻塞等待被调用
方法中的逻辑执行完成。这种方式下,当被调用方法响应时间较长时,会造成调用方长久的阻塞,在高并发下会造成整体系统性能下降甚至发生雪崩。
异步调用恰恰相反,调用方不需要等待方法逻辑执行完成就可以返回执行其他的逻辑,在被
调用方法执行完毕后再通过回调、事件通知等方式将结果反馈给调用方。

以12306为例:采用异步的方式,后端处理时会把请求丢到消息队列中,同时快速响应用户,告诉用户我们正在排队处理,然后释放出资源来处理更多的请求。订票请求处理完之后,再通知用户订票成功或者失败。
处理逻辑后移到异步处理程序中,Web 服务的压力小了,资源占用的少了,自然就能接收
更多的用户订票请求,系统承受高并发的能力也就提升了。

Java并发编程的简单理解_第2张图片

总结

相关知识储备Java并发编程的简单理解_第3张图片Java并发编程的简单理解_第4张图片
Java并发编程的简单理解_第5张图片

而我们需要注意的是,在应对高并发大流量的时候,系统是可以通过增加机器来承担流量冲击
的,至于要采用什么样的方案还是要具体问题具体分析。异步线程处理、检验更新时间等

参考资料:https://juejin.cn/post/6844903752579678222?from=search-suggest
和极客时间

你可能感兴趣的:(java高级,java)