Java面试题汇总——Java多线程面试题汇总
面试题系列文章持续更新,源于个人搜寻和整理总结
线程基础知识
什么是线程和进程?线程与进程的关系是什么?
进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。
线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。
与进程不同的是同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。
对于 Java
来说,一个进程中可以有多个线程,多个线程共享进程的堆和元空间(方法区)资源,但是每个线程有自己的程序计数器、虚拟机栈
和...
面试时候如何反问,并且如何回答有关项目的提问
如何准备项目介绍
常见的问法是,说下你最近的(或最拿得出手的)一个项目。
这时候,你做过什么,描述工作经验和项目,面试官的主要目标是看看是否和简历上一致,他不清楚你做了什么太多的内容,因此这个时候,你甚至可以控制面试官接下来问什么
一般来说,在面试前,大家应当准备项目描述的说辞,自信些,因为这部分你说了算,流利些,因为你经过充分准备后,可以知道你要说些什么。而且这些是你实际的项目经验,那么一旦让面试官感觉你都说不上来,那么可信度就很低了。
一般来说,描述的要素是这样的:
项目基本情况
主动说出你做了哪些事情
这部分的描述一定需要和你的技术背景一致。
一般是解决了什么问题 + 带来了什么价值
描述你在项目里的角色
描述用到的技术细节
在这部分你就可以控制一下面试官问什么
我们可以遵循 STAR
法则来进行回答,整体这样下来,会显得你很有思考力,且具有行动力,可以给企业创造出价值,这也是面试官评定候选人最关键的指标之一。
S:Storyboard 背景是什么
T:Target 目标是什么
A:Answer...
Hibernate,MyBatis,Spring Data JPA等之间的关系
对象关系映射框架 ORM
什么是 ORM
在传统的数据库操作中,我们通常需要直接编写SQL语句,与数据库进行交互。然而,这种方式在面对复杂的业务逻辑时,往往显得繁琐且容易出错。
为了解决这一问题,对象关系映射(Object-Relational Mapping,简称 ORM
)应运而生。作为一种桥梁,ORM将面向对象的编程思想与关系型数据库的结构连接起来,极大地简化了开发流程
ORM,即对象关系映射,是一种编程技术,用于在面向对象编程语言和关系型数据库之间建立联系。
在ORM的框架下:
类:对应着数据库中的一个表,类的属性则对应表中的字段,这就是通常说的,实体类
对象:对应数据库中的一行数据,通过实例化类,我们可以操作数据库中的具体记录。
方法:ORM
框架通常会提供一系列内置方法,开发者只需调用这些方法,就能完成数据库操作。
ORM的工作原理
ORM的核心在于 映射
它通过将类和对象的操作转化为底层的SQL语句,完成与数据库的交互。
那么,开发者在代码中定义模型类,就类似,表的创建。而...
MySQL part5——MySQL中InnoDB存储引擎对MVCC的实现及其原理
认识 MVCC
什么是 MVCC
MVCC(Mutil Version Concurrency
Control)多版本并发控制,是一种并发控制的方法,用于在多个并发事务同时读写数据库时保持数据的一致性和隔离性。
它是通过在每个数据行上维护多个版本的数据来实现的。当一个事务要对数据库中的数据进行修改的时候,MVCC
会为该事务创建一个数据快照,而不是直接修改实际的数据行。(个人认为这一定上参考了COW写时复制机制)
同时,读取数据时,会根据事务的“可见性规则”,选择合适的历史版本进行读取。这种机制让“读运行”和“写操作”可以并行执行,互不阻塞。
在 MySQL 的...
MySQL part5——从MySQL三大日志到两阶段提交,深度拆解MySQL持久化
MySQL的数据持久化过程
事务的支持是数据库区分文件系统的重要特征之一
MySQL
持久化的本质,是把内存中数据的修改安全、可靠地写入磁盘,即使遇到数据库崩溃或者服务器断电这种服务宕机的情况,也能恢复到崩溃前的一致状态。
三大日志
MySQL 日志
主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。
其中,跟 MySQL 持久化流程相关的日志主要是,Redo Log 重做日志,Binlog
二进制日志,Undo Log 回滚日志,它们的架构是这样的
img
Redo Log:是 InnoDB 存储引擎独有的,保证已提交事务不丢失
Binlog:保证数据恢复,而且主从复制也涉及到这个日志
Undo Log:是 InnoDB 特有的日志,记录数据修改前的状态,实现 MVCC
多版本并发控制,而且通过 Undo...
MySQL part4——MySQL索引详解和实践及从索引结构入手详细分析索引
索引
什么是索引
索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构。
索引的作用就相当于书的目录。打个比方:我们在查字典的时候,如果没有目录,那我们就只能一页一页地去找我们需要查的那个字,速度很慢;如果有目录了,我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了。
这样,我们就可以理解下述对索引的描述
索引是帮助MySQL高效获取数据的数据结构,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用数据,这样就可以在这些数据结构上采用高级查找算法
索引底层数据结构存在很多种类型,常见的索引结构有:B 树、 B+ 树...
几种分布式ID的设计方案详解与真实业务选型
想了一下,有必要单独拎出来作为一篇文章
分布式ID
分布式 ID 介绍
我们都知道 ID 是什么内容,也知道需要使用 ID 做什么。
无非就是对系统中的各种数据使用一个唯一编号 ID
来进行唯一标识,这样就能在系统中对数据进行操作。而且 ID
具有独立性,就是说你产生了一条数据需要被持久化,就应该给它一个ID,比如用户
ID 对应且仅对应一个人,商品 ID 对应且仅对应一件商品,订单 ID
对应且仅对应一个订单。
我们现实生活中也有各种 ID,比如身份证 ID 对应且仅对应一个人、地址 ID
对应且仅对应一个地址。
简单来说,ID 就是数据的唯一标识。
那么,单机情况下,我们使用的 ID...
Spring Cloud part29—分布式ID的几种设计方案与实践落地
分布式ID
分布式 ID 介绍
我们都知道 ID 是什么内容,也知道需要使用 ID 做什么。
无非就是对系统中的各种数据使用一个唯一编号 ID
来进行唯一标识,这样就能在系统中对数据进行操作。而且 ID
具有独立性,就是说你产生了一条数据需要被持久化,就应该给它一个ID,比如用户
ID 对应且仅对应一个人,商品 ID 对应且仅对应一件商品,订单 ID
对应且仅对应一个订单。
我们现实生活中也有各种 ID,比如身份证 ID 对应且仅对应一个人、地址 ID
对应且仅对应一个地址。
简单来说,ID 就是数据的唯一标识。
那么,单机情况下,我们使用的 ID...
面向对象编程的设计模式之架构设计模式
前言:这些是什么样的设计模式
之前,我们学习的是GoF(Gang of Four)提出的 23
种经典设计模式(5 创建型 + 7 结构型 + 11 行为型)
接下来,我提到的这些设计模式,他们属于更高层次的
架构模式(Architectural Patterns) 或
企业级设计模式(Enterprise Design Patterns),而不是
GoF
的微观设计模式。它们关注的是整个系统的组织结构、职责划分和控制流,而非单个类或对象之间的交互。
从经典设计模式迈向现代软件架构的关键节点就在这里。掌握这些高层次模式,将帮助你设计出可维护、可扩展、高内聚、低耦合的企业级系统。
他们有很多经典的实现,我只讲解最常使用的和看到的
架构设计模式
关注整个系统的高层结构,决定组件如何组织、通信和部署。
它的选择影响全局、难以后期修改、而且通常决定技术选型。
常见的架构模式如下
MVC 模式
MVVM 模式
三层架构(表现层-业务层-数据层)模式
管道-过滤器模式
微服务架构
事件驱动架构
CQRS(Command Query...
LeetCode第490场周赛AK
记录一下
几乎是压线 AK,就剩下六分钟
image-20260222115357193
最终排名
image-20260222120055900
Q1
image-20260222115741279
给你一个整数数组 nums,其中 nums[i] 表示在第 i
场比赛中获得的分数。
恰好 有两位玩家。初始时,第一位玩家为 主动玩家,第二位玩家为
被动玩家。
按顺序 将下述规则应用于每场比赛 i:
如果 nums[i] 是奇数,主动玩家和被动玩家互换角色。
在每第 6 场比赛(即比赛索引为 5, 11, 17, …
的比赛中),主动玩家和被动玩家互换角色。
主动玩家参与第 i 场比赛,并获得 nums[i] 分。
返回 分数差,即第一位玩家的 总分 减去第二位玩家的 总分 。
示例 1:
输入: nums = [1,2,3]
输出: 0
解释:
第 0 场比赛:分数为奇数,第二位玩家成为主动玩家,获得 nums[0] = 1
分。 第 1 场比赛:没有交换角色。第二位玩家获得...
Redis part8—Redis性能优化
Redis常见阻塞原因
命令阻塞
首先,Redis
是单线程的内存数据库,所有命令都在主线程中串行执行。而且
Redis 中的大部分命令都是 O(1) 时间复杂度,也有少部分 O(n)
时间复杂度的命令。
这意味着,O (1) 命令不会显著阻塞主线程,O (n)
会明显占用主线程,导致后续所有请求排队等待,这就表现成客户端阻塞,超时,响应慢等问题
那么这种情况就是使用不当的命令导致的阻塞,就好像是在 MySQL 那边
select *联查了所有字段导致了全表扫描一样导致的性能问题,但是你
MySQL 能加索引将 O (n) 降为 O (log
n),所以说,当你API或数据结构使用不合理,肯定也会导致这种情况
首先这种全量遍历类是O(n)肯定会影响性能
keys:获取所有的 key 操作
HGETALL:会返回一个 Hash 中所有的键值对。
SMEMBERS:返回 Set 中的所有元素。
对于集合计算类,也是O (n),不当的使用也可能会导致问题
SINTER/SUNION/SDIFF:计算多个
Set...

















