跟着B战学习JAVA面试八股文

embedded/2024/9/25 8:39:55/

学习链接:https://www.bilibili.com/video/BV1gm411S7EX/?spm_id_from=333.337.search-card.all.click&vd_source=efbaa07876b231ae3225ba8999116807

  1. 创建线程的几种方式?
  1. 继承Thread类
  2. 实现Runnable接口
  3. 实现Callable接口
  4. 通过线程池来创建线程
  1. 为什么不建议使用Executors创建线程池?

以创建FixedThreadPool为例,其构造方法为:

java">public static ExecutorService newFixedThreadPool (int nThread) {return new ThreadPoolExecutor (nThread, nThread, 0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
}

发现创建的队列为LinkedBlockingQueue,是一个无界阻塞队列(最大是21亿个任务),如果使用该线程池执行任务,如果任务过多就会不断的添加到队列中,任务越多占用的内存就越多,最终可能耗尽内存,导致OOM。

java">	// 短信关于创建线程池的实践,线程池的大小要结合具体的场景来确定。private static final ExecutorService executor;static {Integer corePoolSize = DeviceConfig.getInstance().getInteger("route.exec.corePoolSize", 16);Integer maximumPoolSize = DeviceConfig.getInstance().getInteger("route.exec.maximumPoolSize", 16);Integer queueCapacity = DeviceConfig.getInstance().getInteger("route.exec.queueCapacity", 1000);executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, 0L,TimeUnit.SECONDS, new LinkedBlockingQueue<>(queueCapacity),Executors.defaultThreadFactory(), new CallerRunsPolicyWithCounter());}// 拒绝策略,计数
public class CallerRunsPolicyWithCounter implements RejectedExecutionHandler {private AtomicLong count = new AtomicLong(0L);@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {if (!executor.isShutdown()) {count.incrementAndGet();r.run();}}public long report() {return count.getAndSet(0L);}}
  1. 线程池有几种状态,分别表示什么?
  1. Running(运行状态):线程池新建或者调用execute()方法后,处于运行状态,能够接收新的任务
  2. ShutDown(关闭状态):调用shutdown()方法后,此时线程池不再接收新的任务,但会执行已提交的等待队列中的任务.
  3. Stop(停止状态):调用shutdownNow()方法时,线程的状态会变为Stop。此时线程池不再接收新的任务,并且会中断正在处理中的任务
  4. Tidying(整理状态):中间状态不做任何处理
  5. Terminated(终止状态):线程池内部的所有线程都已经终止时,线程池进入Terminated状态

在这里插入图片描述

  1. Synchronized和ReentrantLock有哪些不同点?
  1. Sync的底层锁升级策略?
  2. Lock的中断方式?

在这里插入图片描述
在这里插入图片描述

  1. ThreadLocal 有哪些应用场景?它底层是如何实现的?

线程隔离
结构如下,每个线程都会关联一个ThreadLocalMap
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. ReentrantLock分为公平锁和非公平锁,那底层分别是如何实现的?

首先不管是公平锁和非公平锁,他们的底层实现都是使用AQS来进行排队,他们的区别在于线程在使用lock()方法加锁时:

  1. 如果是公平锁,会先检查AQS队列中是否存在线程在排队,如果有线程在排队,则当前线程也进行排队;
  2. 如果是非公平锁,则不会去检查是否有线程在排队,而是直接去竞争锁。

另外,不管是公平锁还是非公平锁,一旦没竞争到锁,都会进行排队,当锁释放时,都是唤醒排在最前面的线程,所以非公平锁只是体现在了线程加锁阶段,而没有体现在线程被唤醒的阶段。

ReentrantLock是可重入锁,不管是公平锁,还是非公平锁都是可重入。

  1. Synchronized 的锁升级过程是什么样的?

在这里插入图片描述

  1. tomcat 为什么要自定义类加载器?

避免因为类名一样而产生冲突。
在这里插入图片描述

  1. 微服务有什么好处?

单体项目的缺点:

  1. 可扩展性受限
  2. 难以维护和更新
  3. 高风险
  4. 技术栈限制
  5. 团队协助复杂

微服务项目的缺点:

  1. 成本挑战
    i. 基础设施成本增加
    ii. 开发和维护成本
  2. 复杂性挑战
    i. 分布式系统复杂性
    ii. 服务发现与治理
  3. 部署挑战
    i. 自动化部署需求
    ii. 版本控制和回滚
  4. 一致性挑战
    i. 数据一致性
    ii. 事务管理
  5. 监控与故障排查挑战
    i. 性能挑战
    ii. 故障排查
  1. 现在有哪些微服务解决方案?
  1. Dubbo + ZK
  2. SpringCloud
    在这里插入图片描述
    在这里插入图片描述
  1. Eureka 实现原理了解吗?

Eureka的实现原理,可以分为以下几个方面:

  1. 服务注册与发现:当一个服务实例启动时,会向Eureka Server发送注册请求,将自己注册到注册中心。Eureka Server会将这些信息保存在内存中,并提供REST接口供其他服务查询。服务消费者可以通过查询服务实例列表来获取可用的服务提供实例,从而实现服务的发现。
  2. 服务健康检查:Eureka通过心跳机制来检测服务实例的健康状态。服务实例会定期向Eureka Server发送心跳,也就是续约,以表明自己的存活状态.如果Eureka Server在一定时间内没有收到某个服务实例的心跳,则会将其标记为不可用,并从服务列表中移除,下线实例。
  3. 服务负载均衡:Eureka客户端在调用其他服务时,会从本地缓存中获取服务的注册信息.如果缓存中没有对应的信息,则会向Eureka Server发送查询请求.Eureka Server会返回一个可用的服务实例列表给客户端,客户端可以使用负载均衡算法选择其中一个去调用。
  1. Eureka Server是怎么保证高可用的?
  1. 多实例部署:通过将多个Eureka Server实例部署在不同的节点上,可以实现高可用性。当其中一个实例发生故障时,其他实例仍然可以提供服务,并保持注册信息的一致性。
    在这里插入图片描述
  2. 服务注册信息的复制:当一个服务实例向Eureka Server注册时,每个Eureka Server实例都会复制其他实例的注册信息,以保持数据的一致性。当某个Eureka Server实例发生故障时,其他实例可以接管其工作,保证整个系统的正常运行.
  3. 自我保护机制:Eureka具有自我保护机制.当Eureka Server节点在一定时间内没有收到心跳时,会进入自我保护模式。在自我保护模式下,Eureka Server 不再剔除注册表中的服务实例,以保护现有的注册信息。这样可以防止由于网络抖动活其他原因导致的误剔除,进一步提高系统的稳定性。
  1. 什么是CAP?为什么三者不能同时拥有?

分布式项目的3个特性:一致性(Consistency),可用性(Availability)、分区容错(Partition-tolerance)

  1. 分区容错性:分布式系统在遇到某节点或者网络分区故障时,仍然能够对外提供服务。
  2. 一致性:所有节点在同一时间的数据完全一致。
  3. 可用性:服务一直可用,而且是正常响应时间。允许读到的是旧的数据。
    在这里插入图片描述
  1. Base理论了解吗?
  1. Basically Available : 基本可用:
  2. Soft state:软状态,即允许多个节点存在数据延迟
  3. Eventually consistent:最终一致性
    在这里插入图片描述
  1. 什么是分布式事务?

ACID

  1. Atomicity: 原子性 一个事务的所有操作,必须全部完成,或者全部不完成。
  2. Consistency: 一致性 在事务开始或结束时,数据库应该在一致状态。
  3. Isolation:隔离性 事务与事务之间不会互相影响
  4. Durability: 持久性 事务一旦完成,就不能返回,变更完全保存到数据库中
    在这里插入图片描述
  1. 分布式事务有哪些常见的实现方案?
  1. 2PC:2阶段 准备-完成 准备-回滚
  2. 3PC:canCommit + 2阶段
  3. TCC:Try-Confirm-Cancel 类似2PC,阻塞粒度小 偏重于代码上解决
  4. SAGA: 流水线事务 == 长事务
  5. 消息队列实现数据最终一致性
  1. 有哪些分布式锁的实现方案?

  2. xxxx


http://www.ppmy.cn/embedded/116533.html

相关文章

创建游戏暂停菜单

创建用户控件 设置样式 , 加一层 背景模糊 提升UI菜单界面质感 , 按钮用 灰色调 编写菜单逻辑 转到第三人称蓝图 推荐用 Set Input Mode Game And UI , 只用仅UI的话 增强输入响应不了 让游戏暂停的话也可以用 Set Game Paused , 打勾就是暂停 , 不打勾就是继续游戏 , 然后…

c/c++八股文

c基础 一、指针和引用的区别 定义方式: 指针是通过 * 操作符定义的变量,用于存储另一个变量的地址。例如: int* p &x;引用是通过 & 操作符定义的别名,直接引用另一个变量。例如: int& r x; 内存占用: 指针是一个独立的变量,占用一定的内存空间。引用不是独立的…

华为认证HCIA篇--网络通信基础

大家好呀&#xff01;我是reload。今天来带大家学习一下华为认证ia篇的网络通信基础部分&#xff0c;偏重一些基础的认识和概念性的东西。如果对网络通信熟悉的小伙伴可以选择跳过&#xff0c;如果是新手或小白的话建议还是看一看&#xff0c;先有个印象&#xff0c;好为后续的…

Redis的一些数据类型(一)

&#xff08;一&#xff09;数据类型 我们说redis是key value键值对的方式存储数据&#xff0c;key是字符串&#xff0c;而value是一些数据结构,那今天就来说一下value存储的数据。 我们数据结构包含&#xff0c;String&#xff0c;hash&#xff0c;list&#xff0c;set和zest但…

spark初步探索

今天我阅读了《基于spark下一代机器学习》这本书&#xff0c;里面spark与sql进行了结合&#xff0c;关于传统领域cv&#xff0c;nlp我认为使用大数据处理并不如python处理方便快捷。学习了里面的基础操作&#xff0c;之前学习的spl也可以进行相对的结合。 在书中我会使用了XGB…

怎样写论文及论文格式?分享4款ai论文生成软件

撰写一篇学术论文是一项复杂而系统的工作&#xff0c;需要从选题、文献综述、研究方法到最终的写作和修改等多个步骤。本文将详细介绍如何写好一篇论文&#xff0c;并推荐四款AI论文生成软件&#xff0c;特别是千笔-AIPassPaper。 如何写好一篇论文 1. 选题与题目表达 选题是…

KOC携手TikTok达人:微内容革命如何重塑品牌传播与消费决策

KOC与TikTok达人通过创作简短而富有创意的“微内容”&#xff0c;不仅迅速抓住了用户的注意力&#xff0c;还引领了一场前所未有的内容营销革命。本文Nox聚星将和大家分析微内容如何成为品牌营销的新载体。 一、微内容的特征与优势 微内容的核心特点在于其简短性。通常&#x…

(done) 声音信号处理基础知识(2) (重点知识:pitch)(Sound Waveforms)

来源&#xff1a;https://www.youtube.com/watch?vbnHHVo3j124 复习物理知识&#xff1a; 声音由物体的振动产生 物体振动会导致空气分支振荡 某一处的空气气压变化会创造一个波 声音是机械波 空气的振荡在空间中传递 能量从空间中的一个点到另一个点 机械波需要媒介&#x…