- 博客(23)
- 收藏
- 关注
原创 Mysql什么情况下行级锁会升级为表锁
行锁升级为表锁的7种场景与应对策略 数据库系统为平衡性能开销,会在特定条件下将行锁升级为表锁。主要场景包括:无索引操作、大批量处理、混合DDL/DML、外键级联、资源紧张等。常见数据库阈值不同(如MySQL约5000行)。优化方案包括:建立有效索引、分批处理数据、降低隔离级别、采用乐观锁等。监控工具可检测锁升级迹象(如MySQL的SHOW ENGINE INNODB STATUS)。合理设计可避免锁升级带来的并发性能下降问题,核心在于优化索引与控制事务粒度。
2025-07-09 17:06:45
459
原创 动态绑定的本质解析
动态绑定是面向对象编程实现多态性的核心机制,本质是通过运行时类型信息和方法表延迟确定方法实现。其实现依赖方法表机制(如C++虚函数表、Java vtable),在调用时根据对象实际类型定位方法。相比静态绑定,动态绑定具有运行时决策、类型驱动等特点,但伴随一定性能开销。该机制支撑了多态特性,符合开闭原则,现代语言通过内联缓存等技术优化其性能。不同语言实现方式各异(C++显式virtual、Java固定vtable、Python动态查找),但核心都是实现运行时的动态方法绑定,是面向对象设计的关键基础。
2025-07-09 15:39:29
352
原创 Java方法表(Method Table)详解
方法表是每个类在JVM中维护的一个方法指针数组,其中存储了该类所有可被虚调用(virtual invocation)的方法的入口地址。
2025-07-09 15:29:57
276
原创 MySQL 中的 MVCC 快照读机制详解
InnoDB的MVCC机制通过版本链、ReadView和undo log实现非阻塞的快照读,保证事务隔离性。快照读无需加锁,看到的是事务开始时的数据快照,与当前读(加锁读取最新数据)形成对比。不同隔离级别下表现不同:REPEATABLE READ保持一致性视图,READ COMMITTED能看到已提交修改。优点包括提高并发和避免读写冲突,缺点是需要额外存储维护版本。MVCC通过隐藏事务ID字段和回滚指针实现版本管理,是MySQL高并发的关键技术,但需注意长时间事务导致的undo log堆积问题。
2025-07-08 15:46:47
391
原创 数据库索引详解
数据库索引是提高查询性能的关键技术,它通过创建特殊数据结构(如B树)快速定位数据,避免全表扫描。常见索引类型包括普通、唯一、主键、复合和全文索引。优点包括加速查询和排序,缺点则是增加存储开销和降低写入速度。最佳实践建议为高频查询列建索引,避免过度索引,并定期优化。EXPLAIN命令可验证索引效果,合理使用索引能显著提升数据库效率。
2025-07-08 15:42:51
363
原创 MySQL REPEATABLE READ(可重复读) 隔离级别的锁机制
MySQL的可重复读(REPEATABLE READ)隔离级别使用复杂的锁机制,包括行锁、间隙锁和临键锁。通过MVCC实现快照读,写操作自动加行锁,SELECT FOR UPDATE可显式加锁。间隙锁解决了幻读问题,锁会保持至事务结束。与READ COMMITTED相比,可重复读的锁机制更严格,保证了更高程度的隔离性。锁基于索引工作,不当使用可能导致锁表或死锁。这种精细的锁机制是实现事务隔离的重要基础。
2025-07-08 15:28:23
506
原创 MySQL 事务隔离级别详解
MySQL事务隔离级别详解:四种标准级别分别是READ UNCOMMITTED(脏读)、READ COMMITTED(避免脏读)、REPEATABLE READ(默认级别,避免脏读和不可重复读)和SERIALIZABLE(完全串行化)。各级别分别存在脏读、不可重复读和幻读问题,隔离级别越高一致性越强但性能越低。MySQL的InnoDB引擎通过MVCC和间隙锁在REPEATABLE READ级别就实现了避免幻读。实际应用中需根据业务需求平衡一致性与性能,通常REPEATABLE READ是最佳选择。(149字
2025-07-08 11:36:34
416
原创 Spring AOP 代理与私有方法调用的关系
Spring AOP代理(JDK/CGLIB)不会代理私有方法,但私有方法仍可在原始对象内部被调用。代理仅拦截public方法:JDK代理基于接口,CGLIB代理通过子类继承。私有方法调用发生在原始对象内部,不经过代理增强逻辑。若通过反射强制调用私有方法,会完全绕过AOP增强(如事务、日志)。最佳实践是将需要增强的方法设为public,避免反射调用私有方法。如需代理私有方法,可改用AspectJ。设计时应遵循Spring规范,将需增强的方法暴露为public,私有方法仅作为内部工具使用。
2025-07-05 16:35:37
354
原创 mybatis分页插件工作原理
摘要:本文解析MyBatis分页插件的核心机制与设计思想。采用Page参数(业务层显式传递)与ThreadLocal(框架层隐式传递)的双轨制,兼顾类型安全和跨组件共享。详细说明拦截器无法直接获取Page参数的技术原因,以及ThreadLocal在分页流程中的必要性。针对常见问题提供解决方案,如分页失效原因、深度分页优化等。提出最佳实践建议:显隐结合传递参数、异步任务处理注意事项。最终提炼出"显隐结合+分层治理"的设计哲学,在类型安全与实现复杂度间取得平衡,为分页功能的使用和定制提供指导
2025-07-05 16:18:23
581
原创 volatile 关键字详解
摘要:Java的volatile关键字解决了多线程环境下的可见性和有序性问题。它确保变量修改立即刷新到主内存,并禁止指令重排序,在单例模式的双重检查锁定中尤为关键。volatile通过内存屏障实现功能,但不同于synchronized,它不保证复合操作的原子性。适用于状态标志、安全发布等场景,但需注意其局限性。现代Java强化了volatile的内存语义,使其成为轻量级线程安全工具,需正确理解其适用场景才能有效使用。
2025-06-29 19:59:20
761
原创 Java同步机制与Class对象知识总结
《Java同步机制与Class对象核心要点》摘要: 本文系统梳理了Java同步机制核心知识点:1) 区分对象锁(实例对象)和类锁(Class对象)两种同步类型;2) 详解Monitor工作原理,包含可重入性和内存可见性特性;3) 分析Class对象作为元数据载体和同步锁的双重作用;4) 提供典型场景的同步方案对照表,如实例数据保护推荐synchronized实例方法,静态数据保护需锁定Class对象。通过多维度知识图谱整合,揭示了对象锁、类锁与Monitor的内在关联,为开发中合理选择同步方式提供了系统化参
2025-06-29 19:46:09
405
原创 既然monitor是对象的,那synchronized为什么能对类进行上锁
摘要:Java中类锁的实现原理是通过锁定类的Class对象来完成的。当使用synchronized修饰静态方法或代码块时,实际上是获取该类对应Class对象的monitor。每个被加载的类在JVM中都有一个Class对象,它包含对象头(含monitor),使类锁机制与对象锁保持统一设计。这种设计延续了Java"锁就是对象"的理念,既保证线程安全又维持设计一致性,典型应用如单例模式中的双重检查锁定。本质上,类锁机制利用了Class对象也是普通Java对象的特性,并不违反monitor属于对
2025-06-29 18:51:52
290
原创 关于 @Valid 和 @Validated 的区别及使用位置
《Java验证注解@Valid与@Validated的核心区别》摘要: 二者主要差异在于来源和功能:@Valid属Java标准(JSR-303),仅支持基础验证;@Validated是Spring扩展,支持验证组功能。使用上,@Validated适合类/方法级验证(如控制器类),@Valid更适合作方法参数验证(尤其请求体对象)。嵌套验证需用@Valid,验证组场景必须@Validated。最佳实践推荐组合使用:类级@Validated+方法参数级@Valid(简单参数用@Validated,复杂对象用@V
2025-06-28 19:14:06
300
原创 HandlerInterceptor
HandlerInterceptor是SpringMVC框架中的关键拦截器接口,用于在请求处理的不同阶段插入自定义逻辑。它包含三个核心方法:preHandle(控制器方法执行前调用)、postHandle(控制器方法执行后,视图渲染前调用)和afterCompletion(请求完成后调用)。与Servlet的Filter相比,HandlerInterceptor在DispatcherServlet之后执行,能够访问Spring Bean和控制器信息,且支持多个有序执行。
2025-05-08 23:09:09
320
原创 java后端代码是如何使用sessionid得到对应session的
在JavaWeb应用中,服务器通过SessionID找到对应的Session对象的过程是自动完成的,但理解其底层机制非常重要。当客户端发起请求时,服务器会从请求中提取SessionID(通常来自Cookie或URL参数),然后在服务器端的Session管理器中查找对应的Session。如果找到则返回,找不到则根据参数决定是否创建新Session。Tomcat等Servlet容器通过doGetSession方法实现这一过程,包括从Cookie中获取JSESSIONID、从Session管理器查找Session
2025-05-08 22:53:08
516
原创 java中Collections.sort()用法
在这个例子中, Comparator.comparingInt(Person::age) 提供了一个比较器,它根据 Person 对象的 age 属性进行升序排序。通过这些示例,你应该能够理解如何在Java中使用 Collections.sort 方法对列表进行排序,并且可以根据需要提供自定义的比较器来控制排序顺序。示例:按对象的某个属性排序如果你有一个对象列表,并且想要根据对象的某个属性进行排序,你可以提供一个自定义的比较器。
2025-05-07 16:05:25
328
原创 java程序初始化顺序
父类静态变量父类静态代码块子类静态变量子类静态块父类非静态变量父类非静态代码块父类构造方法子类非静态变量子类非静态代码块子类构造器。
2024-09-13 00:07:04
321
原创 Java基本数据类型存储在哪里
这些规则适用于基本数据类型的默认值,当声明这些变量时,如果没有显式地赋值,Java会给它们赋予一个默认值(例如`int`为0,`boolean`为`false`,`Object`引用为`null`)。3. **静态成员变量**(类级别的变量,通过类名直接访问):静态变量也存储在堆中,但是它们是在方法区(Method Area,有时也被称作永久代,在JDK 8之后,永久代被元空间(MetaSpace)所替代)的一部分,这部分内存用来存储类的信息以及静态变量。
2024-09-12 15:37:32
763
原创 redisson看门狗机制
Redisson的WatchDog机制是Redisson提供的监控锁的看门狗,它的作用是在Redisson实例被关闭前,不断的延长锁的有效期。当一个拿到锁的线程一直没有完成逻辑,那么看门狗会帮助线程不断的延长锁超时时间,锁不会因为超时而被释放。默认情况下,看门狗的续期时间是30s,也可以通过修改Config.lockWatchdogTimeout来另行指定。
2024-09-11 22:38:56
999
原创 java为什么泛型类型参数必须是引用类型,而不能是基本类型
Java的泛型在编译时进行类型擦除,这意味着在运行时,泛型类型参数会被替换为它们的边界类型(如果没有指定边界,则替换为Object)。:在类型擦除后,泛型类型参数会被替换为它们的边界类型。对于基本类型,边界类型是Object,而包装类型有明确的边界类型。在Java中,泛型类型参数必须是引用类型,而不能是基本类型。这是因为泛型在编译时进行类型擦除,而基本类型在类型擦除后无法恢复。总之,由于Java泛型的类型擦除机制,基本类型不能作为泛型类型参数,而必须使用包装类型。
2024-09-10 20:17:28
572
原创 java中Map接口的实现类底层如何存储数据(简述)
Map接口的实现类(如HashMapTreeMap等)底层使用哈希表结构来存储键值对,使用链表和红黑树来解决哈希冲突。java 8开始,HashMap哈希冲突的解决采用链表 + 红黑树的方案。当某个槽位的链表长度达到8,这个槽位的链表会转化为红黑树。
2024-09-09 22:38:37
330
原创 java如何重写hashCode()和equals()
在Java中,`hashCode()`和`equals()`方法是`Object`类中的两个方法,用于比较对象是否相等。为了正确地使用`Map`、`Set`等集合类,通常需要重写这两个方法。`hashCode()`方法用于返回对象的哈希码,它决定了对象在哈希表中的位置。重写`hashCode()`方法时,应该遵循以下原则:1.:在同一个程序执行期间,只要对象的`equals()`方法使用的属性没有改变,那么多次调用`hashCode()`方法应该返回同一个哈希码。2.
2024-09-08 21:39:25
368
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人