- 博客(135)
- 收藏
- 关注

原创 [Spring框架]Spring事务原理-踩坑
实现IOC(控制反转)的三种方式1. IOC理论的背景下面通过具体的例子来说明:有三种方式:属性注入,构造器注入,自动装配。方式一. 属性注入(setter注入(IOC)这里感谢 CSDN 的原博客:https://blog.csdn.net/zhaoraolin/article/details/789410621. IOC理论的背景上文书说道:软件系统在没有引入IOC容器之前,如果对象A依...
2019-07-13 17:16:40
293
原创 贝壳面试官:Redis为什么这么快?过来,我们聊聊!
极简设计:单线程也能顶万线程精妙结构:数据结构就是生产力智能管理:每一个字节都物尽其用Redis不是因为单线程才快,而是因为它把简单的事情做到了极致。看完这篇面试对话,相信你对Redis的性能特点有了更深入的理解。不知道你是否也遇到过类似的面试题?你在面试中遇到过哪些关于Redis的问题?你觉得还有哪些Redis性能相关的知识点值得补充?你在实际工作中是如何优化Redis性能的?
2025-04-21 09:00:00
776
原创 别让数据库成为你的软肋,MySQL事务原理全面解析
- 转账操作(两个原子操作)-- 扣款-- 加款它确保这些操作要么全部成功,要么全部失败,不会出现一半成功一半失败的情况。这就是事务的基本特性,也是解决上述问题的关键。那么,MySQL是如何实现这种机制,并在保证数据安全的同时兼顾性能的?下文将一一解答。Undo Log:记录数据修改前的值,用于事务回滚和MVCCRedo Log:记录数据修改后的值,确保数据持久性这两种日志协同工作,保证了事务的原子性和持久性。原子性:由Undo Log实现,记录修改前数据,支持回滚操作一致性。
2025-04-18 09:00:00
702
原创 图解MySQL日志体系:让你明明白白记住各种Log
通过本文,我们深入了解了MySQL日志系统的核心内容:1. Redo Log:确保数据持久性,像草稿纸,记录每一步操作。2. Undo Log:支持事务回滚,类似价格标签,随时可以撤销错误。3. Binlog:用于数据复制和恢复,犹如记账本,记录所有交易历史。在数据库的世界里,日志不仅是记录,更是保障数据安全与一致性的基石。希望这些内容能帮助你更深入地理解MySQL日志系统的关键作用!
2025-04-14 09:00:00
1663
原创 熬夜调研:从IDEA迁移到Cursor后,我的工作效率提升了40%!
👉 凌晨两点,为了赶项目进度,复制粘贴着重复的模板代码,感觉自己像个高级CV工程师;👉 线上bug紧急修复时,一边被领导催着,一边疯狂在Stack Overflow和各种文档间切换查询解决方案;👉 明明ChatGPT能给出靠谱方案,却被复制粘贴、窗口切换搞得焦头烂额,丢失了编码状态。如果你也曾有类似体验,那这篇文章绝对值得一读。我将分享我的"救命稻草" —— 在尝试Cursor IDE后,我的日常开发效率提升了约40%。👨💻 不用再写那些无脑的模板代码,AI智能补全帮你解放双手;
2025-04-01 22:24:01
1288
原创 美团面试官灵魂拷问:你的Redis分布式锁真的用对了吗?
面试官:先说说分布式锁解决什么问题?我:在分布式集群中,多个服务实例可能并发操作共享资源(如库存扣减、订单状态变更)。1️⃣ 互斥性:同一时刻只能有一个客户端持有锁;2️⃣ 防死锁:即使客户端崩溃或网络异常,锁也能被释放3️⃣ 容错性:只要大部分Redis节点正常工作,客户端就能正常加锁解锁。🌰电商秒杀:防止超卖;支付系统:避免重复扣款;定时任务:防止多节点重复执行。
2025-03-24 09:00:00
646
原创 AI 时代,CRUD Boy 的路在何方?
AI 时代,“CRUD Boy” 危机四伏,却也满藏机遇。深挖业务,从流程里寻价值;打磨软技能,于团队协作中展优势;积累项目经验,借实战打造个人实力;拓展技术,向 AI 领域拓边界。让我们一起拥抱变化,迎接挑战,在 AI 时代创造属于自己的辉煌!最后,我最近弄了一个Java技术交流群,讨论面试、后端等领域知识,如果你感兴趣,欢迎关注我公众号回复【1】,我拉你入群哈~(我的公众号:程序员徐述)目前已经有 100 人加入。如果你已经在群里,请忽略~
2025-03-18 09:00:00
871
原创 线上 TraceId 集体失踪,大促排查如何破局?
并发工具极大提升了并发代码编写的效率,也预先为潜在问题备好高效解法,是开发过程中的得力助手。但开发人员不能仅满足于表面应用,务必深入剖析其实现逻辑,明晰不同场景下的适用规则。若对并发工具一知半解、盲目套用,不仅难以发挥其最大效能,面对复杂问题时会陷入被动,更可能在生产环境中引发严重线上故障。所以 J.U.C 虽好,可不要贪杯哦!最后,我最近弄了一个Java技术交流群,讨论面试、后端等领域知识,如果你感兴趣,欢迎关注我公众号回复【1】,我拉你入群哈~(我的公众号:程序员徐述)
2025-03-10 09:00:00
791
原创 重生之我在操作系统当线程
作为操作系统的最小调度单元,我的一生是资源争夺与秩序构建的缩影。“每一次上下文切换,都是效率与公平的权衡;每一把锁的争夺,都是安全与性能的博弈;每一次内存访问,都是速度与一致性的较量。从诞生到消亡,我在并发的洪流中挣扎求生,也在混沌的世界中寻找秩序。线程的世界,正如人类社会一般复杂而微妙,唯有不断学习与进化,才能在这场永不停息的竞争中立于不败之地。作者:徐述公众号:程序员徐述关注我,一起探索程序员的奇妙世界!
2025-03-07 09:00:00
565
原创 一行CompletableFuture代码引发的P0级事故!
这次事故,源于一段暗藏风险的代码。高并发下,默认线程池不堪重负,引发连锁反应,致使系统瘫痪。线程池配置失当:直接沿用默认参数,未结合业务负载、服务器性能调校,高并发场景易过载。异常处理缺位:捕获异常后不记录、不上报,还遗漏异步任务异常捕获,问题排查困难。并发安全失控:共享变量操作未加锁,使用非线程安全集合类,高并发下数据错乱。任务依赖混乱:不规划任务启动顺序,也不考虑依赖失败策略,一处出错就全盘皆输。线上无小事,生产环境中要注意:默认配置是魔鬼,高并发下没有侥幸!
2025-03-02 22:24:44
699
原创 美团面试题:线上线程池的参数,到底如何设置?
我监控:实时采集线程池的运行状态。策略:根据监控数据定义调整策略。调优:结合压测和调优,找到最佳参数组合。自动化:实现自动化调整,提高响应速度。面试官(点头):不错,思路很清晰,看来你对这个问题理解得挺透彻。准备明天就来入职吧。最后,我最近弄了一个Java技术交流群,讨论面试、后端等领域知识,如果你感兴趣,加我微信备注加群,我拉你入群哈~(我的微信号:shawne11)目前已经有近 100 人加入。如果你已经在群里,请忽略~综上,希望今天这篇文章对你帮助!
2025-02-23 22:06:43
848
原创 面试被问线程两次 start,我直接尬住了
通过前面的分析,相信大家已经明白了:start() 方法只能调用一次。如果尝试调用两次,程序会抛出 IllegalThreadStateException 异常。这是因为线程的生命周期是单向的,从创建(NEW)到运行(RUNNABLE),再到终止(TERMINATED)。一旦线程开始执行,它的状态会逐步推进,最终结束,无法回退。如果你觉得这篇文章对你有帮助,欢迎关注我的公众号【程序员徐述】,回复“666”,获取更多关于面试题汇总。希望大家都能在技术道路上越走越远,面试顺利!
2025-02-20 22:50:42
286
原创 面试必考题:核心线程不被回收,你真的会答吗?
核心线程的“保命”机制默认情况下,allowCoreThreadTimeOut 为 false,核心线程的 timed 为 false。核心线程会调用 workQueue.take(),一直阻塞等待任务,而不会被回收。核心线程的回收条件如果显式设置 allowCoreThreadTimeOut 为 true,核心线程会调用 workQueue.poll,在超时后退出。另外,如果线程池关闭,核心线程也会退出。死循环的作用:让线程持续获取任务,并动态响应线程池状态变化。
2025-02-19 22:02:48
695
原创 面试必考题:线程池创建后,里面到底有没有线程?
问:线程池创建后,里面到底有没有线程?线程池创建时,内部并没有线程。线程是按需创建的,只有在任务提交时才会根据核心线程数、任务队列和最大线程数的配置来创建线程。问:如何让线程池创建后就有线程?如果希望线程池创建后就有线程,可以使用或预热核心线程。线程池的设计非常精妙,理解其背后的原理,才能更好地使用它。希望这篇文章能帮你彻底搞懂线程池的初始化过程,下次面试再遇到这个问题,就可以自信地回答了!如果你觉得这篇文章对你有帮助,欢迎关注我的公众号【程序员徐述】,回复“666”,获取更多关于面试题汇总。
2025-02-15 17:33:38
256
原创 线程池创建陷阱:为什么阿里禁止使用Executors?
Executors 的工厂方法虽然方便,但隐藏了线程池的核心参数和配置,容易导致资源耗尽、拒绝策略不灵活、难以监控和调优等问题。相比之下,直接使用 ThreadPoolExecutor 构造函数创建线程池,可以更精细地控制线程池的行为,更好地适应实际业务需求。
2025-02-12 21:51:33
911
原创 线上突发:MySQL 自增 ID 用完,怎么办?
自增 ID 用尽确实是个让人头疼的问题,但其实并不可怕。只要我们提前做好准备,问题就能轻松解决。提前搭建监控和预警机制:定期检查自增ID的使用情况,避免等到 ID 用完了才慌忙应对。一旦发现接近上限,及时采取措施,就能有效避免线上故障。系统设计时多考虑细节:设计数据库时多考虑未来的扩展性。如果业务增长迅速,早期就可以用 BIGINT 替代 INT,或者直接考虑分布式 ID 生成方案。这样一来,未来的数据增长就不会成为问题。总之,技术问题并不可怕,真正可怕的是没有提前规划和准备。
2025-01-22 21:19:53
749
原创 黄子韬点赞数为何变负?揭秘抖音 Bug 真相
其实背后是一个经典的计算机问题——Integer 溢出。Integer 溢出就是当一个整数超过了计算机能表示的最大或最小范围时,结果就会“回绕”到相反的极端,比如最大值加一会变成最小值。-2^31,即;2^31 - 1,即2147483647。超过最大值时,循环到最小值。小于最小值时,循环到最大值。// 最大值 2147483647// 溢出,结果变为 -2147483648当达到2147483647后,再多一个赞,数值就会变成,从正数直接跳到负数。这也提醒我们,
2025-01-13 09:00:00
799
原创 深入分析线程安全问题的本质
线程安全问题指的是当多个线程同时访问共享资源时,程序无法按预期正常执行,导致数据不一致。原子性问题:多个线程同时访问共享变量时,可能会中断或交叉执行,导致不正确的结果。可见性问题:一个线程对共享变量的修改,其他线程可能看不到,造成数据不一致。重排序问题:由于编译器、JVM或处理器优化,导致代码执行顺序不一致,产生错误的结果。下面我们具体分析下。原子性问题:操作被拆分成多个步骤,多个线程同时执行时,操作可能会中断或交叉执行,导致数据错误。可见性问题:源于缓存导致的不同线程工作内存与主内存不一致;
2025-01-09 21:05:14
755
原创 面试官:说说有了进程,为什么还要有线程?
操作系统通过时间片分配来让多个进程轮流执行。比如,有三个进程:A、B、C。进程A首先获得CPU时间片执行。当A的时间片用完,操作系统就会切换到进程B或C。问题是,A未执行完成,如何确保下次继续执行?为了解决这个问题,操作系统引入了“上下文”的概念。在每个任务运行前,CPU需要知道任务是从哪儿运行的,然后从哪儿开始的,也就是说,需要系统给它设置好CPU寄存器和程序计数器。CPU寄存器:CPU内置的容量小,但是速度极快的内存;程序计数器:是用来存储正在执行的指令位置,或者即将执行的下一条指令位置。
2024-12-31 10:21:51
1121
原创 北漂 5 年:从月薪 9000 到年薪 30 万的程序员成长史!
最近 1-2 年大环境不好,各大公司裁员的消息频频登上热搜,找工作变得愈发困难,很多简历投出去却得不到回音。这时候,最重要的就是找到自己的定位,明确自己的优势,不被外部噪音影响。职业生涯不能是一潭死水,永远要进步、提升自己。记住:你可以不屠龙,但不能不磨剑。有时候,职业道路并不一定是线性的。你不必为了一个短期的结果而去焦虑,也不必为了暂时的困难而自怜。把注意力放在自己能控制的部分,提升自己的核心竞争力,才能在不确定的环境中走得更远。
2024-12-31 09:27:01
636
原创 一文读懂进程的前世今生
进程是一个程序在计算机中执行的实例。它不仅包括程序的代码,还包括程序的当前状态、资源(如内存、CPU时间等)、程序计数器、堆栈和数据等。进程是操作系统进行资源管理和调度的基本单位。简单来说,进程就是程序在运行时的【容器】,它包含了程序执行所需要的一切资源和信息。当你启动一个应用程序时,操作系统会为该程序创建一个进程,以便管理和执行。我们回到文章开头的几个问题。①. 操作系统为什么引入进程?在多道程序环境下,多个程序可以同时执行,这时它们的执行变得不再是线性的。
2024-12-08 14:37:05
722
原创 Java程序死锁问题定位与解决
一定是发生在并发中;互不相让:当两个(或更多)线程(或进程)相互持有对方所要的资源,又不主动释放,导致程序陷入无尽的阻塞,这就是死锁。死锁特点:两个或多个线程(进程)相互等待对方释放资源,导致所有线程都无法继续执行。解决方法:避免一个线程持有多个资源的情况,或使用超时机制,如果一个线程在一定时间内没能获得锁,就放弃等待。活锁特点:线程仍然在运行,但由于不断地响应对方,始终没有实际进展。解决方法:为避免活锁,可以设置超时机制,或者使用协调机制来避免线程之间过度的反应。饥饿。
2024-11-26 19:57:06
966
原创 NPE:三目运算符导致空指针问题
我们都知道,Java中并没有指针,所谓的【Java指针】实际上指的是 Java 中的引用。空指针就是指向空的引用。当引用为空时,如果尝试调用它所指向对象的成员变量或方法,就会抛出空指针异常。成员变量和方法是属于对象的(排除静态成员),它们只有在对象存在时才能被访问。空指针并不指向任何对象,因此它没有对应的成员变量和方法。当通过空指针尝试访问这些属性或方法时,就会导致空指针异常。
2024-11-16 10:13:11
796
原创 JavaAgent 技术原理及实战
利用 javassist 对 Log 框架进行切面增强。利用 Spring 的拦截器技术实现了 Web 请求的 traceId 初始赋值。通过整合 dubbo SPI,结合 dubbox 调用拦截器,实现 traceId 的拦截及赋值。引入TransmittableThreadLocal 解决父子线程上下文传递的问题。
2024-03-31 18:06:11
1753
1
原创 揭秘Java switch语句中的case穿透现象
在开始揭秘case穿透现象之前,我们先简单回顾一下switch语句的基本用法。switch语句用于根据变量的不同取值执行相应的代码块。// 执行代码块1break;// 执行代码块2break;...default:// 默认代码块switch case支持的6种数据类型:switch 表达式后面的数据类型只支持byte、short、int整形类型、字符类型char、枚举类型和java.lang.String类型。根据expression的值,程序会跳转到对应的case。
2023-10-29 12:55:47
1437
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人