- 博客(18)
- 收藏
- 关注
原创 Redis集群的哨兵模式
主节点(Master):负责处理读写请求,数据变更后同步到从节点(Slave/Replica)。从节点(Slave):只读,通过全量复制(首次连接时)和增量复制(持续同步)保持与主节点数据一致。但主从复制存在致命缺陷:主节点故障时,需人工介入将某个从节点提升为新主节点,并调整其他从节点指向新主节点。这在高并发场景(如电商大促)中会导致服务中断,无法满足可用性要求。哨兵模式是Redis官方推出的分布式高可用解决方案。
2025-07-17 11:22:06
424
原创 每日面试题07:线程池的工作流程
线程池的工作流程可以概括为:任务提交 → 检查核心线程(是否空闲) → 核心线程忙则入队 → 队列满了创建非核心线程 → 线程数满了触发拒绝策略。核心参数(workQueuehandler)的组合决定了线程池的行为,而阻塞队列的选择是其中的关键——它直接影响了任务是“排队等线程”还是“挤不下了直接拒绝”。理解线程池的底层逻辑,能帮助我们在实际开发中更合理地配置线程池参数,避免资源浪费或系统崩溃,让并发程序更高效、稳定地运行。
2025-07-17 10:38:47
594
原创 二进制运算
逻辑运算(与、或、异或、非)是计算机执行条件判断、位操作的基础,支撑着程序流程控制和数据加密;算术运算(加减乘除)是数值计算的核心,支撑着科学计算、工程模拟等复杂任务;其中,异或因其“相同为0,不同为1”的独特规则,在加密、校验、位操作中表现突出,是计算机组成原理中最具实用性的逻辑运算之一。
2025-07-15 16:02:01
472
原创 JUC工具类
CountDownLatch 是 JUC 中用于线程协调的同步工具类,而 JUC 是 Java 并发编程的核心工具包,覆盖了锁、原子操作、并发集合、线程池、异步编程等几乎所有多线程场景。掌握这些工具类能显著提升多线程程序的性能和可靠性。
2025-07-15 15:32:36
374
原创 Mysql默认存储引擎InnoDB和底层数据结构
InnoDB 选择 B+树而非红黑树,本质是为了满足磁盘存储的高效性和事务场景的复杂性。B+树通过多路平衡、顺序存储、链表连接等设计,完美解决了数据库索引的核心痛点(范围查询、高并发写入、磁盘 IO 优化)。在黑马点评项目中,我们选择 RedisINCR作为全局唯一ID生成方案,正是基于对 InnoDB 特性的深度理解:RedisINCR生成的严格递增 ID,与 InnoDB 聚簇索引的顺序写入特性完美匹配,大幅提升了订单表的写入性能。一句话总结。
2025-07-15 13:32:59
730
原创 分布式全局唯一ID生成:雪花算法 vs Redis Increment,怎么选?
优点:本地生成、性能极高;趋势递增对数据库友好;ID可解析,便于排查问题。缺点:依赖本地时钟(时钟回拨需处理);机器ID需提前规划(扩展性受限)。雪花算法是“本地生成的高性能分布式ID引擎”,适合高并发、无中心、需要ID携带信息的场景;Redis Increment是“依赖外部服务的递增ID生成器”,适合已有Redis基础设施、需要严格递增的场景。选择时,核心考虑点:是否需要严格递增?是否依赖外部服务?对性能和延迟的要求? 没有绝对最优,只有最适合业务的方案。
2025-07-15 11:28:31
895
原创 每日面试题06:自定义线程池与线程池工厂
通过构造函数自定义线程池时,需要显式指定以下核心参数。这些参数共同决定了线程池的行为模式和资源分配策略。自定义线程池:优先使用构造函数,根据业务场景调整参数(如根据常驻任务量设置,workQueue根据任务特性选择有界/无界队列)。避免OOM:尽量使用有界队列(如),并合理设置;拒绝策略推荐(减缓任务提交)或(丢弃旧任务)。官方建议:《Java并发编程实战》明确指出,直接使用Executors工厂方法可能隐藏线程池的实际配置,推荐显式通过构造函数创建,以提高透明度和可控性。
2025-07-15 10:47:10
573
原创 @Resource和@Autowired
拦截器是 Spring MVC 处理请求的核心组件,负责在请求到达 Controller 前/后执行逻辑(如 Token 校验、日志记录)。在拦截器中使用依赖注入时,构造器注入比字段注入更优在自定义拦截器中,构造器注入相比字段注入(@Autowired强制依赖有效性:确保拦截器实例创建时所有必需依赖已就绪,避免运行时 NPE。线程安全final字段保证依赖不可变,符合单例 Bean 的线程安全要求。代码清晰:显式声明依赖,降低维护成本。测试友好。
2025-07-14 16:42:42
1033
原创 每日面试题05:ArrayList和LinkedList的底层原理
ArrayList和LinkedList的选择没有绝对答案,关键在于场景匹配若需高频随机访问(如遍历、按索引操作),选ArrayList;若需高频头尾插入/删除(且数据量不大),选LinkedList(或更优的ArrayDeque内存敏感场景,优先ArrayList(紧凑存储更省内存);多线程环境,根据需求选择线程安全的扩展实现(如或理解底层原理后,结合具体业务场景的性能瓶颈(如访问频率、插入位置、数据量),才能做出最优选择。
2025-07-13 22:23:48
770
原创 每日面试题04:volatile字段的原理
volatile是 Java 的关键字,用于修饰共享变量。可见性:确保线程对变量的修改立即同步到主内存,其他线程能立即看到最新值;有序性:禁止编译器和 CPU 对变量的读写指令进行重排序,保证代码执行顺序与编写顺序一致。简单来说,volatile是多线程环境下的“变量同步器”,让共享变量的修改在多线程间“可见”,且操作“有序”。volatile适用场景原因状态标志(如线程启停)仅需单次读写,无需复合操作,volatile轻量且高效。单例模式的DCL。
2025-07-12 21:31:00
665
原创 单体架构与分布式架构的事务机制
维度单体架构()分布式系统(以 Seata 为例)注解类型(Spring 原生)(Seata 扩展)管理范围单个服务内的本地事务(同一数据库)跨多个服务的分布式事务(多数据库)底层依赖数据库原生事务(如 MySQL InnoDB)分布式事务协调器(TC)+ 本地事务(可能用实现复杂度简单(框架自动管理)复杂(需引入 TC、配置事务分组、处理网络异常)典型场景本地业务逻辑(如用户注册+日志记录)
2025-07-12 17:04:17
602
原创 每日面试题03:CAS的底层原理及其ABA问题
CAS的核心:通过CPU原子指令实现无锁的“比较+交换”操作,是高效并发的基础。ABA问题的本质:CAS仅比较值是否相等,无法感知中间修改,可能导致逻辑错误。解决方案:引入版本号(如)跟踪修改历史,或根据业务场景忽略ABA问题,或改用锁机制。关键结论:CAS是无锁并发的利器,但需警惕ABA问题的潜在风险。通过版本号或锁机制可有效规避,确保程序逻辑正确性。
2025-07-12 09:43:55
916
原创 线程安全问题
线程安全问题的本质是:多个线程并发访问共享资源(如内存数据结构、缓存、数据库等)时,由于操作顺序未同步或同步机制缺失,导致数据不一致、脏读、幻读等不符合预期的结果。其核心矛盾在于“共享资源的并发修改未被正确控制”。举个通俗的例子:若两个线程同时对一个共享变量count执行count++操作(本质是),若没有同步机制,可能出现线程A读取count=5后未写入,线程B也读取count=5并写入6,最终count仅变为6而非预期的7。这就是典型的线程安全问题。多线程环境下的线程安全问题,本质是。
2025-07-11 09:42:33
737
原创 每日面试题02:ConcurrentHashMap的底层原理
是 Java 并发包()中提供的线程安全哈希表实现,专为高并发场景下的键值对存储设计。它在保证线程安全的同时,通过优化锁机制和数据结构,显著提升了多线程环境下的性能。底层结构:与HashMap同源,均基于哈希表(数组+链表/红黑树)实现,核心逻辑(如哈希冲突解决、扩容机制)高度一致。HashMap是非线程安全的哈希表,适合单线程或低并发场景;是线程安全的哈希表,通过 CAS、和细粒度锁机制,在多线程高并发场景下保证数据一致性,同时保持高性能。
2025-07-10 22:27:59
880
原创 线程与异步相关问题
优先异步:当任务以I/O为主(等待时间长、CPU空闲),或需要高并发低资源消耗时(如实时通信、Web服务器),异步(尤其是单线程事件循环)更优。优先多线程:当任务以计算为主(CPU密集),或需要利用多核并行加速时(如大数据处理、科学计算),多线程更优。混合使用:复杂系统中,可结合两者(如异步处理I/O,多线程处理计算),平衡成本与效率。
2025-07-10 16:41:22
739
原创 JDK和Maven
JDK:Java 开发的“地基”,负责源代码编译、字节码运行。Maven:Java 项目的“管家”,负责依赖管理和构建流程自动化。联系:Maven 依赖 JDK 完成编译和运行,JDK 为 Maven 处理的代码提供运行环境,二者共同支撑 Java 项目的全生命周期。最后顺便提一下如何更新Maven仓库的镜像地址,提高依赖的下载速度?在国内使用 Maven 时,由于默认的中央仓库()服务器位于国外,下载依赖速度较慢甚至超时。通过更换为国内镜像仓库。
2025-07-10 14:07:21
886
原创 每日面试题01 HashMap的底层原理
即使未触发数组扩容,若某个桶的链表长度超过 8(且数组长度 ≥ 64),会转换为红黑树,占用更多内存。)时,为了优化查询效率(链表的查询时间复杂度为 O(n),红黑树为 O(logn)),会将链表转换为红黑树(需同时满足数组长度 ≥ 64,避免数组过小时频繁转换)。红黑树与链表的转换需要额外的计算和内存操作(如红黑树的旋转、颜色调整,或链表节点的指针修改),频繁切换会显著影响性能。当数组长度 ≥64 时,若红黑树节点数降至 6 以下,说明冲突已缓解(可能因扩容或数据分布变化),此时退化为链表可节省内存。
2025-07-09 23:12:44
1043
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人