- 博客(36)
- 收藏
- 关注
原创 复盘面试的时候,为什么不想听到自己的声音?
每次面试的时候,我都会录下音来,但是每次都不愿打开,觉得自己声音好难听。大脑的听觉区(上颞回)对自我声音非常敏感:差异越大,神经活动越强,主观上就越觉得“刺耳”。简单说:你的录音声音“难听”,并不是声音本身不好,而是你从未真正听过别人听到的你。简单理解:你平时听到的声音比别人听到的更“低沉”,录音才是别人真正听到的你。盲测实验中,参与者给自己的声音评分高于客观评价,说明自我声音评价存在偏差。提出“声音对抗”现象:人们对录音中的自我声音往往有负面情绪。我们大脑对自己声音有固定认知,形成“自我声音印象”。
2025-09-02 01:01:42
576
原创 (Mysql)MVCC、Redo Log 与 Undo Log
MVCC:保证高并发下的一致性读,靠 Undo Log 保存历史版本Redo Log:保证事务提交的持久性,顺序写入磁盘Undo Log:支持事务回滚和 MVCC 版本管理理解技巧(存储最新修改,保证不会丢)(保存历史版本,可以撤回操作)MVCC = 时间旅行(每个事务看到自己时间点的版本)
2025-09-01 23:26:08
744
原创 (MySQL)分布式锁
MySQL 分布式锁的两种实现方式:基于事务的(阻塞锁)基于唯一索引插入(非阻塞锁)虽然可以用 MySQL 实现分布式锁,但实际生产环境更多推荐 Redis 或 ZooKeeper,因为它们在性能、可用性和可靠性上更适合大规模分布式场景。
2025-09-01 21:44:36
154
原创 (Redis)Redis 分布式锁及改进策略详解
在 Redis 主从架构下,如果主节点写入成功但未同步到从节点,主节点宕机后从节点被提升为主,会导致锁丢失。如果业务逻辑执行时间 > 锁过期时间,可能导致锁自动释放,其他客户端拿到锁,出现数据不一致。因此,分布式锁应运而生,Redis 因其高性能与丰富指令,成为分布式锁的常用实现工具。Redisson 封装了分布式锁,支持可重入锁、公平锁、读写锁、自动续期等功能。中,多台服务器之间共享同一个资源时,如果没有锁,很可能出现。提高了分布式锁的可靠性,避免因单点故障导致锁失效。:同一时刻只有一个客户端获取锁。
2025-09-01 21:37:12
332
原创 JWT 笔记自留
当客户端请求时,服务端会拿到 Token,重新用密钥对 Header+Payload 计算签名,然后和 Token 中的 Signature 对比,如果一致说明没有被篡改;JWT 由三部分组成:Header、Payload、Signature。服务端不会存储 Token,而是通过。等字段,确认 Token 是否还有效。某些场景下(如用户主动注销、修改密码),即使 Token 未过期也需要立即失效。可以将失效 Token 存入 Redis 黑名单,校验时查询。不一致 → 拒绝请求(Token 可能被伪造)
2025-08-28 02:58:50
319
原创 (计算机网络)说说Websocket
来做消息中转,各节点订阅同一个通道,再把消息推送给本机连接的用户。WebSocket 长时间不用可能被中间网络断开,所以需要心跳检测。必要时也会缓存未发送的消息,重连后再补发。客户端验证通过后,HTTP 连接就升级为。网络波动/防火墙/NAT 可能导致连接断开,服务端却感知不到。如果连续多次超时,就主动断开连接并进入重连流程。在单机情况下,服务端直接遍历连接列表逐个发送就行;移动网络/服务端重启/断网,都会导致连接断开。维护连接集合,消息只推送给相关用户。握手完成后,HTTP 连接升级为。
2025-08-28 02:32:30
579
原创 (操作系统)死锁是什么 必要条件 解决方式
死锁(Deadlock)是指两个或多个进程(或线程)在执行过程中,因争夺资源而造成一种相互等待的现象。如果没有外力作用,它们将永远陷入等待,程序无法继续执行。大家都在等别人先释放资源,结果谁也不释放,形成无限等待。死锁是并发编程中常见的棘手问题,必须理解其四个必要条件。解决死锁的核心思想是破坏死锁条件或避免环形等待。在实际业务中,更常用的是加锁顺序统一、加锁超时、乐观锁等工程化手段。
2025-08-25 20:18:12
369
原创 (Spring Cloud )注册中心宕机后,RPC 调用还能继续吗?
初次调用:依赖注册中心,宕机时会失败。初次之后调用:依赖本地缓存,短时间内还能继续调用。长时间宕机:可能导致服务调用异常或失效。
2025-08-24 21:21:14
319
原创 (计算机网络)JWT三部分及 Signature 作用
JWT(JSON Web Token)是一种用于的轻量级令牌,广泛用于分布式系统、单页应用(SPA)和移动端登录。
2025-08-24 19:06:02
425
原创 (Redis)主从哨兵模式与集群模式
哨兵 + 主从:适合单主多从场景,保证主节点故障时快速切换。集群模式:适合数据量大、高并发场景,支持水平扩展和自动容错。两者是独立方案,一般不会同时使用。
2025-08-24 17:25:33
1617
原创 (Redis)过期删除策略
策略删除时机优点缺点是否被 Redis 采用定时删除过期时间一到立刻删除内存释放及时CPU 开销大❌惰性删除访问时检查是否过期对 CPU 友好内存可能浪费✅定期删除每隔一段时间随机抽查内存与性能平衡删除不够精准✅。
2025-08-24 17:03:35
403
原创 (Redis)内存淘汰策略
Redis 内存满时需要根据策略来淘汰数据。→ 淘汰最近最少用的数据。→ 淘汰使用次数最少的数据。TTL→ 优先淘汰即将过期的数据。推荐或,适合大多数缓存场景。
2025-08-24 16:48:23
1225
原创 (Redis)缓存三大问题及布隆过滤器详解
布隆过滤器是一种高效的集合判断数据结构,用来判断某个元素是否“可能存在”。优点:内存占用小,查询速度快。缺点:存在少量误判(可能存在但实际上不存在),但不会漏判。问题出现场景特点影响解决方案穿透查询缓存和数据库都不存在的数据永远不命中缓存数据库持续高压,可能被攻击利用缓存空值、布隆过滤器、限流击穿某个热点 Key 突然过期单个热点 Key 瞬时失效大量请求打到数据库加锁、逻辑过期、热点 Key 不过期雪崩大量 Key 同时过期或 Redis 宕机批量缓存失效数据库被瞬时压垮。
2025-08-23 23:02:12
719
原创 (JAVA集合)HashMap put 流程与HashMap数据结构
计算 key 的 hash 值根据 hash 计算桶索引数组未初始化 → 初始化数组桶为空 → 插入节点桶非空 → 遍历链表或红黑树key 相同 → 更新 valuekey 不同 → 插入节点插入后检查链表长度 → 链表过长 → 树化检查是否达到扩容阈值 → 扩容。
2025-08-23 16:47:06
407
原创 (JAVA集合)为什么 ArrayList 是线程不安全的?
在 Java 集合框架中,ArrayList 是常用的 List 实现之一,操作方便、查询高效。但在多线程环境下,它是线程不安全的。本文将分析原因,并提供解决方案。
2025-08-23 16:21:47
187
原创 (JUC)Java线程池工作原理
如果队列已满,并且当前线程数小于最大线程数,则创建新线程(非核心线程)来处理任务。如果线程数已达到最大线程数,并且队列也满了,任务将被拒绝,执行拒绝策略。当任务过多时的处理方式,例如抛异常、丢弃、由调用方执行等。在 Java 中,线程的创建和销毁开销较大,频繁使用。线程池中能容纳的最大线程数量。如果当前线程数小于核心线程数,直接创建新线程执行任务。线程池必须保持的常驻线程数量,即使空闲也不会销毁。如果核心线程已满,尝试将任务放入阻塞队列中等待执行。当前线程池中实际运行的线程数,动态变化。
2025-08-23 14:29:55
786
原创 (JUC)Java中的锁升级机制 AI整理
在 Java 并发编程中,是最常用的关键字。JDK1.6 之前,被认为是重量级锁,性能开销较大;而在 JDK1.6 之后,HotSpot 虚拟机引入了锁优化机制,包括锁升级(Lock Escalation/Lock Inflation)和锁消除、锁粗化等,从而大幅度提升了的性能。其中,锁升级机制是理解 JVM 同步优化的核心。无锁 → 偏向锁 → 轻量级锁 → 重量级锁。升级是单向的,不可逆。在 JDK1.6 之后性能大幅提升,已经可以在很多场景媲美。
2025-08-23 01:26:16
403
原创 (JVM)Java中啃老的类加载器与双亲委派机制
作用:用户自己写的,通常用来实现特殊需求(比如从网络、数据库、加密文件里加载 class)。举例:Tomcat、Spring Boot 就会自定义类加载器来隔离不同模块的 class。
2025-08-21 17:59:56
882
原创 (JVM)Java 对象创建的完整过程
在日常开发和面试中,经常会被问到表面上只是一个new关键字,但 JVM 在幕后完成了一系列复杂操作。可以总结为以下。
2025-08-21 17:42:36
314
原创 (Spring)全局异常处理 + ApiResponse + Lombok 注解综合笔记
作用:定义一个全局增强类,对所有 或 生效。功能:全局异常捕获全局数据绑定()全局参数初始化()注意:本身不处理异常,只定义作用域。是 的组合。作用:对全局 Controller 生效返回 JSON 格式(适合 RESTful API)示例: 效果:捕获所有 Controller 层未处理的异常返回统一的 JSON 响应:1.3 @ExceptionHandler 作用:定义具体的异常处理方法。使用位置:Controller 内部 → 只处理本 Controller 的异常 类
2025-08-13 14:39:07
409
原创 (JVM)JVM内存模型及相关概念笔记
堆(Heap):存放Java对象实例,包含年轻代和老年代。方法区(从Java8开始称为元空间Metaspace):存放类的元数据,如类结构、方法字节码等。虚拟机栈(JVM Stack):线程私有,存放方法调用的栈帧。本地方法栈(Native Method Stack):用于执行本地方法,线程私有。程序计数器(PC寄存器):线程私有,指示当前执行指令地址。直接内存(Direct Memory):JVM外的内存,常用于NIO等场景。
2025-08-11 18:30:44
340
原创 人话版 为什么要在Java 8引入默认方法?
我们知道,Java8之前规范定义了所有接口必须要实现。但是后面人们逐渐发现,这样的规范,不利于代码的重构和对接口的拓展。比如,我有一个新的类要实现这个接口,他就必须先实现里面的所有方法;但是这个类,并没有必要实现之前的方法,所以在Java8之后我们引入了默认方法,用以降低代码的冗余。
2025-08-09 21:53:08
154
原创 HashCode、equals重写 及 HashMap/HashSet 等系列问题AI总结
不同对象经过哈希函数计算后,得到相同的哈希值,称为哈希碰撞。哈希表在定位桶时会遇到冲突,内部通过链表或红黑树遍历来区分。这是哈希表必须处理的正常现象。知识点说明hashCode 和 equals 关系equals 相等时,hashCode 必须相等哈希碰撞不同对象可能有相同 hashCode,哈希表通过链表或树结构解决冲突HashMap 唯一键相同 key 会替换旧值,不新增键HashSet 唯一元素通过 HashMap 的 key 唯一性实现去重hashCode 生成时机。
2025-08-09 18:52:26
582
原创 (Java基础)源码层面分析 equals和 ==
首先,String类型继承自Object,而两个Object实例的对象进行比较,比较的是地址引用。所以即使是相同内容的字符串,因为继承自Object,实例化为两个不同的对象之后,保存在了不同地址。通过对equals重写,在比较地址引用是否相同的基础上,又加了一层内容比较,从而解决了这个问题。我们可以看到,String类里面,不仅判断引用是否相同,还判断了长度、内容是否完全一致。因此,单纯用 == 比较地址而不比内容的方法,就不可取了。所以,在equals方法不进行重写的情况下,
2025-08-09 18:22:51
662
原创 (Java基础)异常处理中throw和throws的区别
如果抛出受检异常,一定要在方法上声明throws。抛非受检异常时,可以只用throw,不用声明throws。
2025-08-09 16:27:03
134
原创 (Java基础)如何获取类中的private私有对象?
良好封装的类通常会为私有成员提供公共的getter方法,外部通过调用getter方法获取私有成员的值。反射允许在运行时访问类的结构信息,包括私有成员。通过反射可以绕过访问权限限制,直接读取或修改私有字段。
2025-08-09 15:33:42
223
原创 (Java基础)接口中抽象方法和默认方法辨析
接口里的是没有实现的方法。实现接口的类,否则类必须声明为抽象类。抽象方法默认是,定义时可省略这两个关键字。
2025-08-09 14:29:57
313
原创 (JUC)JUC编程中如何保证线程安全?
想象你往账户里加钱,这活得一次性做完,不能半路被别的线程抢先改。Java里最常用的保障手段就是锁和atomic,比如,它们能保证操作是“原子”的,不会被线程切来抢占。
2025-08-08 16:14:41
179
原创 (场景)MyBatis 的 #{} 和 ${} 究竟有什么区别?
{}是安全的参数传递,MyBatis 会帮你自动处理,强烈推荐用它。${}是不安全的字符串拼接,只适合用来拼表名、列名这种不会被当成参数的数据,千万别用它传用户输入的数据。
2025-08-08 15:24:24
323
原创 解释一下Spring Bean 的作用域
每次调用getBean()时,都会创建一个新的 Bean 实例。每个 HTTP 会话(即一个用户的登录会话)拥有一个独立的 Bean 实例。整个 Web 应用范围唯一的 Bean,所有用户、所有请求共享。应用场景:缓存系统配置数据字典、首页下拉列表缓存等每个 WebSocket 会话创建一个 Bean 实例,适用于实时通信服务。作用域生命周期应用范围是否共享状态适合场景singleton容器启动后永久,自动销毁全局是配置类、服务组件等prototype每次获取创建新实例任意。
2025-08-06 14:46:46
418
原创 Spring 的事务什么时候会失效?
回滚事务,而对CheckedException则需要手动回滚。回滚事务,而对CheckedException则需要手动回滚。必须用 try-catch 或 throws 声明。🔴 没有被 Spring 托管(如未加。通常是程序逻辑错误,比如除以零、空指针等。常用于外部资源操作,如文件、网络、数据库。注解应加在实现类的具体方法上。必须通过 Spring 的。)或其子类,才会自动回滚。把方法抽到另一个类中调用;只能作用于 public。Spring 默认对。Spring 默认对。所以对于检查异常,在。
2025-08-05 18:34:43
354
原创 Spring 容器中单例 Bean创建、反射与 AOP 动态代理
类型创建方式是否动态代理用途普通单例 Bean反射构造实例否业务逻辑AOP 增强的单例 Bean反射构造 + 代理是日志、事务、认证等增强。
2025-08-05 17:45:56
300
原创 Spring 如何通过三级缓存解决单例Bean循环依赖?
A 依赖 B,B 又依赖 A,这就是典型的循环依赖。如果直接创建就会无限套娃,构造不出来。Spring 的三级缓存位于缓存级别缓存名称说明一级缓存存放完全初始化好的单例 Bean二级缓存存放初始化未完成的 Bean 半成品(早期引用)三级缓存存放 ObjectFactory,用于生成 Bean 的早期引用。
2025-08-05 17:32:04
346
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人