怎么理解分布式、高并发、多线程?(含面试题和答案解析)

2023-11-01

看到分布式、高并发、多线程这三个词的时候,很多人是不是都认为分布式=高并发=多线程?
当面试官问到高并发系统可以采用哪些手段来解决,或者被问到分布式系统如何解决一致性的问题,是不是一脸懵逼?
确实,在一开始接触的时候,不少人都会分布式、高并发、多线程将三者混淆,误以为所谓的分布式高并发的系统就是能同时供海量用户访问,而采用多线程手段不就是可以提供系统的并发能力吗?实际上,他们三个总是相伴而生,但侧重点又有不同。
怎么理解分布式、高并发、多线程?(含面试题和答案解析)

接下来我就看看分布式、高并发、多线程这三者之间到底有什么区别?

什么是分布式?

分布式更多的一个概念,是为了解决单个物理服务器容量和性能瓶颈问题而采用的优化手段。该领域需要解决的问题极多,在不同的技术层面上,又包括:分布式文件系统、分布式缓存、分布式数据库、分布式计算等,一些名词如Hadoop、zookeeper、MQ等都跟分布式有关。从理念上讲,分布式的实现有两种形式:
水平扩展:当一台机器扛不住流量时,就通过添加机器的方式,将流量平分到所有服务器上,所有机器都可以提供相当的服务;
垂直拆分:前端有多种查询需求时,一台机器扛不住,可以将不同的需求分发到不同的机器上,比如A机器处理余票查询的请求,B机器处理支付的请求。

什么是高并发?

相对于分布式来讲,高并发在解决的问题上会集中一些,其反应的是同时有多少量:比如在线直播服务,同时有上万人观看。
高并发可以通过分布式技术去解决,将并发流量分到不同的物理服务器上。但除此之外,还可以有很多其他优化手段:比如使用缓存系统,将所有的,静态内容放到CDN等;还可以使用多线程技术将一台服务器的服务能力最大化。
怎么理解分布式、高并发、多线程?(含面试题和答案解析)

什么是多线程?

多线程是指从软件或者硬件上实现多个线程并发执行的技术,它更多的是解决CPU调度多个进程的问题,从而让这些进程看上去是同时执行(实际是交替运行的)。
这几个概念中,多线程解决的问题是最明确的,手段也是比较单一的,基本上遇到的最大问题就是线程安全。在JAVA语言中,需要对JVM内存模型、指令重排等深入了解,才能写出一份高质量的多线程代码。

总结一下:
分布式是从物理资源的角度去将不同的机器组成一个整体对外服务,技术范围非常广且难度非常大,有了这个基础,高并发、高吞吐等系统很容易构建;
高并发是从业务角度去描述系统的能力,实现高并发的手段可以采用分布式,也可以采用诸如缓存、CDN等,当然也包括多线程;
多线程则聚焦于如何使用编程语言将CPU调度能力最大化。
怎么理解分布式、高并发、多线程?(含面试题和答案解析)

下面给大家分享一些面试官常问的分布式、高并发、多线程的面试题
1、分布式系统怎么做服务治理
针对互联网业务的特点,eg 突发的流量高峰、网络延时、机房故障等,重点针对大规模跨机房的海量服务进行运行态治理,保障线上服务的高SLA,满足用户的体验,常用的策略包括限流降级、服务嵌入迁出、服务动态路由和灰度发布等
2、对分布式事务的理解
本质上来说,分布式事务就是为了保证不同数据库的数据一致性。
事务的ACID特性 原子性 一致性 隔离性 持久性
消息事务+最终一致性
CC提供了一个编程框架,将整个业务逻辑分为三块:Try、Confirm和Cancel三个操作。以在线下单为例,Try阶段会去扣库存,Confirm阶段则是去更新订单状态,如果更新订单失败,则进入Cancel阶段,会去恢复库存。总之,TCC就是通过代码人为实现了两阶段提交,不同的业务场景所写的代码都不一样,复杂度也不一样,因此,这种模式并不能很好地被复用。
3、如何实现负载均衡,有哪些算法可以实现?
经常会用到以下四种算法:随机(random)、轮训(round-robin)、一致哈希(consistent-hash)和主备(master-slave)。
4、分布式集群下如何做到唯一序列号
Redis生成ID 这主要依赖于Redis是单线程的,所以也可以用生成全局唯一的ID。可以用Redis的原子操作 INCR和INCRBY来实现。
5. 什么是进程
进程是指运行中的应用程序,每个进程都有自己独立的地址空间(内存空间)。
比如用户点击桌面的IE浏览器,就启动了一个进程,操作系统就会为该进程分配独立的地址空间。当用户再次点击左边的IE浏览器,又启动了一个进程,操作系统将为新的进程分配新的独立的地址空间。目前操作系统都支持多进程。
6. 什么是线程
进程是表示自愿分配的基本单位。而线程则是进程中执行运算的最小单位,即执行处理机调度的基本单位。通俗来讲:一个程序有一个进程,而一个进程可以有多个线程。
7. 线程和进程有什么区别
线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。
8. 多线程的几种实现方式
(1) 继承Thread类创建线程
Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法将启动一个新线程,并执行run()方法。这种方式实现多线程比较简单,通过自己的类直接继承Thread,并重写run()方法,就可以启动新线程并执行自己定义的run()方法。
(2) 实现Runnable接口创建线程
如果自己的类已经继承了两一个类,就无法再继承Thread,因此可以实现一个Runnable接口
(3) 实现Callable接口通过FutureTask包装器来创建Thread线程
(4) 使用ExecutorService、Callable、Future实现有返回结果的线程
ExecutorService、Callable、Future三个接口实际上都是属于Executor框架。返回结果的线程是在JDK1.5中引入的新特征,有了这种特征就不需要再为了得到返回值而大费周折了。
可返回值的任务必须实现Callable接口;无返回值的任务必须实现Runnabel接口。
执行Callable任务后,可以获取一个Future对象,在该对象上调用get()方法就可以获取到Callable任务返回的Object了。(get()方法是阻塞的,线程无返回结果,该方法就一直等待)
9. 多线程中忙循环是什么
忙循环就是程序员用循环让一个线程等待,不像传统方法wait()、sleep()或者yied()它们都放弃了CPU控制,而忙循环不会放弃CPU,它就是在运行一个空循环。这么做的目的是为了保留CPU缓存,在多核系统中,一个等待线程醒来的时候可能会在另一个内核运行,这样会重建缓存。为了避免重建缓存和减少等待重建的时间就可以使用它了。
10. 什么是java内存模型
java内存模型定义了java虚拟机在计算机内存中的工作方式。JMM决定了一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存中,每一个线程都有一个私有的本地内存,本地内存中存储了该线程以读/写共享变量的副本。
11. 为什么要用线程池?
线程池提供了一种限制和管理资源(包括执行一个任务)。 每个线程池还维护一些基本统计信息,例如已完成任务的数量。
这里借用《Java并发编程的艺术》提到的来说一下使用线程池的好处:
降低资源消耗。 通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
提高响应速度。 当任务到达时,任务可以不需要的等到线程创建就能立即执行。
提高线程的可管理性。 线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
12、什么是乐观锁和悲观锁
1)乐观锁:就像它的名字一样,对于并发间操作产生的线程安全问题持乐观状态,乐观锁认为竞争不总是会发生,因此它不需要持有锁,将比较-替换这两个动作作为一个原子操作尝试去修改内存中的变量,如果失败则表示发生冲突,那么就应该有相应的重试逻辑。
2)悲观锁:还是像它的名字一样,对于并发间操作产生的线程安全问题持悲观状态,悲观锁认为竞争总是会发生,因此每次对某资源进行操作时,都会持有一个独占的锁,就像synchronized,不管三七二十一,直接上了锁就操作资源了。
13、高并发、任务执行时间短的业务怎样使用线程池?并发不高、任务执行时间长的业务怎样使用线程池?并发高、业务执行时间长的业务怎样使用线程池?
1)高并发、任务执行时间短的业务,线程池线程数可以设置为CPU核数+1,减少线程上下文的切换
2)并发不高、任务执行时间长的业务要区分开看:
a)假如是业务时间长集中在IO操作上,也就是IO密集型的任务,因为IO操作并不占用CPU,所以不要让所有的CPU闲下来,可以加大线程池中的线程数目,让CPU处理更多的业务
b)假如是业务时间长集中在计算操作上,也就是计算密集型任务,这个就没办法了,和(1)一样吧,线程池中的线程数设置得少一些,减少线程上下文的切换
c)并发高、业务执行时间长,解决这种类型任务的关键不在于线程池而在于整体架构的设计,看看这些业务里面某些数据是否能做缓存是第一步,增加服务器是第二步,至于线程池的设置,设置参考其他有关线程池的文章。最后,业务执行时间长的问题,也可能需要分析一下,看看能不能使用中间件对任务进行拆分和解耦。

欢迎大家一起交流,喜欢文章记得点个赞,感谢支持!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

怎么理解分布式、高并发、多线程?(含面试题和答案解析) 的相关文章

  • 987页的Java面试宝典,看完才发现,应届生求职也没那么难

    前言 现在已经九月底 金九银十也已经过去了一大半 很明显今年的面试季明显不如往年火热 对于求职者来说 也更难了一些 马上迎来国庆节 假期一过 十月份又过去了三分之一 综合来看今年确实不是面试的最佳时期 不过趁今年所剩的时间来好好准备 明年的
  • python按列写入数据到excel

    要将数据按列写入 Excel 可以使用 Python 的 openpyxl 库 首先 需要安装 openpyxl 库 可以使用以下命令在终端或命令提示符中安装 pip install openpyxl 然后 可以按照以下步骤编写代码 1 导
  • Qt源码分析:Qt程序是怎么运行起来的?

    一 从 exec 谈起 一个标准的Qt gui程序 在启动时我们会coding如下几行简洁的代码 include widget h include
  • 内网穿透的应用-使用Net2FTP轻松部署本地Web网站并公网访问管理内网资源

    文章目录 1 前言 2 Net2FTP网站搭建 2 1 Net2FTP下载和安装 2 2 Net2FTP网页测试 3 cpolar内网穿透 3 1 Cpolar云端设置 3 2 Cpolar本地设置
  • 软件开发和网络安全哪个更好找工作?

    为什么今年应届毕业生找工作这么难 有时间去看看张雪峰今年为什么这么火就明白了 这么多年人才供给和需求错配的问题 在经济下行的今年 集中爆发 供给端 大学生越来越多 需求端 低端工作大家不愿去 高端岗位又太少 很多基础行业 比如机械 土木 所
  • 6 - 数据备份与恢复|innobackupex

    数据备份与恢复 innobackupex 数据备份与恢复 数据备份相关概念 物理备份与恢复 逻辑备份 推荐 使用binlog日志文件实现对数据的时时备份 使用日志 恢复数据
  • 【计算机毕业设计】校园体育赛事管理系统

    身处网络时代 随着网络系统体系发展的不断成熟和完善 人们的生活也随之发生了很大的变化 人们在追求较高物质生活的同时 也在想着如何使自身的精神内涵得到提升 而读书就是人们获得精神享受非常重要的途径 为了满足人们随时随地只要有网络就可以看书的要
  • 【计算机毕业设计】Java图书馆智能选座系统

    现代经济快节奏发展以及不断完善升级的信息化技术 让传统数据信息的管理升级为软件存储 归纳 集中处理数据信息的管理方式 本图书馆智能选座系统就是在这样的大环境下诞生 其可以帮助使用者在短时间内处理完毕庞大的数据信息 使用这种软件工具可以帮助管
  • APP端网络测试与弱网模拟

    当前APP网络环境比较复杂 网络制式有2G 3G 4G网络 还有越来越多的公共Wi Fi 不同的网络环境和网络制式的差异 都会对用户使用app造成一定影响 另外 当前app使用场景多变 如进地铁 上公交 进电梯等 使得弱网测试显得尤为重要
  • python超详细基础文件操作【建议收藏】

    文章目录 前言 发现宝藏 1 文件操作 1 1 文件打开与关闭 1 1 1 打开文件 1 1 2 关闭文件 1 2 访问模式及说明 2 文件读写 2 1 写数据 write 2 2 读数据 read 2 3 读数据 readlines 2
  • 新入职一个00后卷王,每天加班到2点,太让人崩溃了····

    在程序员职场上 什么样的人最让人反感呢 是技术不好的人吗 并不是 技术不好的同事 我们可以帮他 是技术太强的人吗 也不是 技术很强的同事 可遇不可求 向他学习还来不及呢 真正让人反感的 是技术平平 却急于表现自己的人 每天加班到12点 在老
  • 电商数据api接口商品评论接口接入代码演示案例

    电商数据API接口商品评论 接口接入入口 提高用户体验 通过获取用户对商品的评论 商家可以了解用户对商品的满意度和需求 从而优化商品和服务 提高用户体验 提升销售业绩 用户在购买商品前通常会查看其他用户的评论 以了解商品的实际效果和质量 商
  • 【计算机毕业设计】北工国际健身俱乐部

    本系统为会员而设计制作北工国际健身俱乐部 旨在实现北工国际健身俱乐部智能化 现代化管理 本北工国际健身俱乐部管理自动化系统的开发和研制的最终目的是将北工国际健身俱乐部的运作模式从手工记录数据转变为网络信息查询管理 从而为现代管理人员的使用提
  • 【计算机毕业设计】二手图书交易系统

    随着世界经济信息化 全球化的到来和互联网的飞速发展 推动了各行业的改革 若想达到安全 快捷的目的 就需要拥有信息化的组织和管理模式 建立一套合理 动态的 交互友好的 高效的二手图书交易系统 当前的信息管理存在工作效率低 工作繁杂等问题 基于
  • Oracle EBS AP发票导入 API Rejection List 第二部分

    Oracle EBS AP发票导入 API Rejection List 第二部分 The report lists the reason the invoice could not be imported and prints a bri
  • 面试官问,如何在十亿级别用户中检查用户名是否存在?

    面试官问 如何在十亿级别用户中检查用户名是否存在 前言 不知道大家有没有留意过 在使用一些app注册的时候 提示你用户名已经被占用了 需要更换一个 这是如何实现的呢 你可能想这不是很简单吗 去数据库里查一下有没有不就行了吗 那么假如用户数量
  • 数据库 | 面试官:一次到底插入多少条数据合适啊?.....面试连环炮

    数据库 面试官 一次到底插入多少条数据合适啊 面试连环炮 数据库插入操作的基础知识 插入数据是数据库操作中的基础 但是 我们程序员将面临随之而来的问题 如何快速有效地插入数据 并保持数据库 性能 当你向数据库中插入数据时 这些数据直接存储到
  • Mysql中设置只允许指定ip能连接访问(可视化工具的方式)

    场景 Mysql中怎样设置指定ip远程访问连接 Mysql中怎样设置指定ip远程访问连接 navicat for mysql 设置只有某个ip可以远程链接 CSDN博客 前面设置root账户指定ip能连接访问是通过命令行的方式 如果通过可视
  • 深入解析 YAML 配置文件:从语法到最佳实践

    一 认识YAML YAML YAML Ain t Markup Language 是一种人类可读的数据序列化语言 它的设计目标是使数据在不同编程语言之间交换和共享变得简单 YAML采用了一种简洁 直观的语法 以易于阅读和编写的方式表示数据结
  • Python 使用 NoSQL 数据库的优选方案

    NoSQL 数据库因其高性能 可扩展性和灵活性而风靡一时 然而 对于 Python 程序员而言 选择合适的 NoSQL 数据库可能会令人困惑 因为有多种选择可供选择 那么 哪种 NoSQL 数据库最适合 Python 呢 2 解决方案 根据

随机推荐

  • struts2+hibernate+spring整合各个相关的配置文件

    一 先把struts2 struts2 2 1 1版 搭起来 1 先拷struts2的jar包 2 配置web xml
  • PyPI 镜像切换至国内源

    临时使用 pip install i https pypi tuna tsinghua edu cn simple some package 设为默认 确保pip更新至最新版本 python m pip install upgrade pi
  • java----关于Console类的报错

    public class console public static void main String args Console console System console String root console readLine 账户
  • 如何正确应用GNU GPLv3 和 LGPLv3 协议

    文章目录 前言 GNU GPLv3 0 Permissions 许可 Conditions 条件 Limitations 限制 GNU LGPLv3 0 应用GPLv3 0 应用LGPLv3 0 建议的内容 添加文件头声明 附录 GNU G
  • 让更多消费者接受刷脸支付养成刷脸习惯

    扫码支付能够取代现金和刷卡支付 就是基于其便捷的支付体验 消费者只要带上手机 用手机扫码就可以完成支付 免去了许多携带现金或卡的不便 降低了遗失风险 但是扫码支付也是过度依赖了手机这一媒介 在手机忘带和没电的时候 也是束手无策 基于此 刷脸
  • 慢SQL语句优化

    对慢SQL语句优化一般可以按下面几步思路 开启慢查询日志 设置超过几秒为慢SQL语句 抓取慢SQL语句 通过explain查看执行计划 对慢SQL语句分析 创建索引并调整语句 再查看执行计划 对比调优结果 参数 slow query log
  • git版本库创建三部曲(git权威指南笔记)

    1 全局配置 a 告诉git当前用户的姓名和邮箱 git config global user name heaiming git config global user email 576439313 qq com b 设置git命令别名
  • CSS改变layui时间控件不显示秒

    laydate time list gt li last child display none width 0 laydate time list gt li not last child width 50 layui laydate ma
  • Win7系统安装哪个版本的Chrome浏览器

    Win系统安装Chrome浏览器 Win7系统环境 安装Chrome应该尽量考虑2021年发布的浏览器版本 理由如下 Win7版Chrome 续命 到2022年 延长支持6个月 Win7版Chrome 续命 到2022年 90版本Chrom
  • starting switch Root:systemd [1]: Failed to execute /bin/sh, giving up : No such file or directory

    启动centos 卡在starting switch Root starting switch Root systemd 1 Failed to execute bin sh giving up No such file or direct
  • LeetCode第二章链表

    203 移除链表元素 题目链接 203 移除链表元素 给你一个链表的头节点 head 和一个整数 val 请你删除链表中所有满足 Node val val 的节点 并返回 新的头节点 示例 1 输入 head 1 2 6 3 4 5 6 v
  • C++初始化参数列表(类的组合)

    A 类的组合 定义 类的组合就是以另一个的对象为数据成员 注意 要优先使用组合而不是继承 组合表达式的含义一部分的关系 类的组合案例分析 1 类组合包含的类的对象 必须采用初始化参数列表方式调用各自类当中的构造函数去初始化 2 要通过包含的
  • 用户级线程和内核级线程

    用户级线程和内核级线程 根据在用户空间还是在核心实现多线程机制 线程又被分为用户级线程 User Level Thread 和内核级线程 Kernel Level Thread
  • 文件操作【上篇】

    文章目录 1 为什么使用文件 2 什么是文件 2 1 程序文件 2 2 数据文件 2 3 文件名 3 文件的打开和关闭 3 1 文件指针 3 2 文件的打开和关闭 4 文件的顺序读写 4 1 fputc 写文件 4 2 fgetc 读文件
  • 【再回首Python之美】【模块 math】math模块的基本使用

    学好数理化 走遍天下都不怕 所以一定要把Python的math模块学好 math简介 math提供两个数学常量和众多数学函数 这俩常量和众多数学函数都是哪些呢 通过dir math 一看便知 使用math模块之前 一定要把模块包括进来 告诉
  • 关于Jenkins插件无法更新的问题

    由于Jenkins默认的更新站点服务器在国外 所以国内使用时需要翻墙 下面整理了一些国内的镜像站点 可以将更新站点修改后 进行相关插件的更新 国内镜像站点 站点一 实测通过 http mirror xmission com jenkins
  • ipad连接电脑_躺在被窝玩电脑,利用ipone ipad远程控制局域网电脑

    时光荏苒 人生的旅途来到了2019年 小科祝愿大家在新的一年里 猪 事顺利 和和美美 冬天 一年中最寒冷的季节 作为一个南方人 对于寒冷是唯恐而不及了 既没有暖气 一天开着空调又太耗电 所以能在床上解决的事情就坚决不下床 今天小科来教大家如
  • python 声音合成,使用python进行声音生成/合成?

    Is it possible to get python to generate a simple sound like a sine wave Is there a module available for this If not how
  • 机械革命蛟龙16ubuntu双系统的移除与重装

    介绍一下本人重装的一个初衷 首先系统更新内核导致cuda无法运行 其次原本的70g空间捉襟见肘 因此想要重装分配更多一些空间 若没有扩容的需求可以去找找系统自带的重装方法 应该会比我下面的流程快很多 1 预备工作 1 1 查看电脑的引导方式
  • 怎么理解分布式、高并发、多线程?(含面试题和答案解析)

    看到分布式 高并发 多线程这三个词的时候 很多人是不是都认为分布式 高并发 多线程 当面试官问到高并发系统可以采用哪些手段来解决 或者被问到分布式系统如何解决一致性的问题 是不是一脸懵逼 确实 在一开始接触的时候 不少人都会分布式 高并发