-
为什么Caffeine的get方法默认不阻塞写入因为Caffeine把“缓存未命中+异步加载”和“同步计算+阻塞等待”做了明确分离。它默认走的是get(key,mappingFunction)这条路径,而这个方法在key不存在时,会用你传的mappingFunction同步计算值并写入,**期间其他线程对同一key的get调用会各自触发计算,不共享loading过程**——也就是常说的“缓存击穿”风险点。常见错误现象:get(key,()->heav
-
SonarQube报告“未在finally中关闭ObjectInputStream”并非误报:当外层流(如FileInputStream)关闭时抛出异常,内层流(ObjectInputStream)将被跳过关闭,导致资源泄漏。本文详解兼容旧Java版本的安全关闭模式。
-
Springfox3.x在SpringBoot2.6+需配置spring.mvc.throw-exception-if-no-handler-found:false且spring.resources.add-mappings:true,访问路径为/swagger-ui/;SpringBoot3.x不兼容Springfox,须迁移到springdoc-openapi。
-
静态代码块不适合放耗时操作,因其在JVM类初始化阶段单线程阻塞执行,失败会导致ExceptionInInitializerError使类不可用;应改用静态内部类懒加载、@PostConstruct或SpringBean生命周期管理。
-
TIME_WAIT是TCP必要机制,端口耗尽主因是短连接QPS超临时端口回收能力;需查ip_local_port_range与ss-s中tw值是否接近上限,并以“cannotassignrequestedaddress”为铁证,而非仅看TIME_WAIT数量。
-
DirtyCardQueue背压是G1GC中跨Region写操作引发的性能瓶颈,表现为UpdateRS耗时升高、TPS下滑、MixedGC频繁但老年代存活率低;需结合G1ConcRefinementThreads与G1RSetUpdatingPauseTimePercent协同调优,并治理高频跨Region写模式。
-
不推荐直接用Executors创建线程池,因其默认无界队列易致内存溢出、未指定线程工厂、缺乏自定义拒绝策略;阿里Java手册明确禁止,推荐直接使用ThreadPoolExecutor。
-
静态类变量线程不安全,需通过synchronized锁、原子类、volatile(仅限简单赋值)、ThreadLocal或改用实例变量等方式保障线程安全。
-
无符号右移(>>>)将整数二进制位序列整体右移,高位恒补0,不考虑符号位,使负数转为非负大整数;需基于补码理解,注意类型提升、移位量取模及不可用于取绝对值。
-
MyBatis3.4+要求JDK8+,JDK11+需添加jakarta.xml.bind-api;配置文件须置于classpath根路径;MySQL8驱动需指定serverTimezone;MapperXML必须在mybatis-config.xml中注册且namespace与接口全限定名一致。
-
自定义Filter必须实现doFilter方法,需调用chain.doFilter放行或手动响应阻断;url-pattern仅支持前缀、扩展名和默认匹配;@WebFilter需配合@ServletComponentScan;读取requestbody需用包装类缓存。
-
本文介绍如何将具有next()方法(可能抛出检查型异常)的自定义类(如数据库游标)正确封装为惰性、可中断、符合JavaStream规范的流,重点解决异常处理与终止逻辑问题,并提供可生产使用的Spliterator实现方案。
-
本文介绍如何通过融合MLKit的对象检测与人脸检测能力,实现对指定人物的稳定追踪与头部姿态估计,有效避免背景人员运动导致的误识别,并支持实时人数粗略统计。
-
抽象类可定义静态方法和字段,静态字段用于子类共享数据且不可重写,静态方法适合封装不依赖实例的通用逻辑;接口静态成员有访问限制,而抽象类更灵活。
-
ThreadLocal为每个线程提供独立变量副本,避免并发冲突。通过get()和set()方法实现线程专属数据访问,适用于数据库连接、用户上下文传递和格式化工具体等场景。由于底层ThreadLocalMap的键为弱引用、值为强引用,若不及时调用remove()可能导致内存泄漏。尤其在线程池中,线程复用时未清理会引发脏数据。最佳实践包括使用后立即remove()、将ThreadLocal声明为privatestatic。正确使用可提升多线程代码的安全性与清晰度。