-
volatile不能替代synchronized,因其仅保证可见性与有序性(通过MESI缓存行失效),但不保证i++等复合操作的原子性;而synchronized通过monitorenter/monitorexit指令强制加锁并刷新整个工作内存,确保原子性。
-
关键变量必须声明为volatile以保障多线程读写可见性,避免“改了但没生效”;需配合同步块串行化配置更新与线程池调整,并通过日志和压测验证生效一致性。
-
white-space:nowrap仅控制文本换行行为,不改变盒模型,需配合flex-shrink:0、明确宽度、overflow:hidden及无覆盖样式才能生效;配text-overflow:ellipsis时三者缺一不可。
-
AOP捕获错目标主因是变量生命周期失控而非切点错误;须禁用this引用穿透代理、限定切点包路径、管控ThreadLocal一致性、规范调试快照。
-
Java内存泄漏最常见原因是静态集合类长期持有短生命周期对象引用,如staticList/Map未及时清理,导致对象无法被GC回收,持续占用堆内存。
-
Java变量生命周期由类型、作用域和引用关系共同决定,并绑定JVM内存分区:基本类型局部变量存栈中,随方法进出而创建销毁;引用变量本身在栈、所指对象在堆;成员变量随对象存堆,静态变量存方法区/元空间;JVM还支持逃逸分析与活变量优化,使对象可提前被GC回收。
-
Collectors.maxBy和minBy需配合groupingBy使用,返回Optional类型,须用orElse等安全解包;可用collectingAndThen简化为非Optional值,并支持复合比较器。
-
SpringBoot的@Value注解仅对Spring容器管理的Bean生效;若模型类未被Spring托管(如直接new创建或非@Component类),属性注入将失败,导致值为null。SpringBoot的@Value注解仅对Spring容器管理的Bean生效;若模型类未被Spring托管(如直接new创建或非@Component类),属性注入将失败,导致值为null。在SpringBoot应用中,@Value注解的正常工作依赖于Spring的
-
JavaNIO的Channel是双向非阻塞的,必须配合Buffer使用,需正确调用flip()、clear()等方法管理position/limit/capacity;FileChannel支持随机定位,SocketChannel不支持;Selector要求Channel必须非阻塞,且close()与wakeup()存在线程安全依赖。
-
ConcurrentHashMap在JDK1.8后采用CAS+synchronized实现线程安全,以Node数组+链表/红黑树结构提升并发性能,通过synchronized锁单个桶节点实现细粒度控制,允许多线程在不同桶上并发写入,仅在哈希冲突时竞争,显著提高吞吐量;推荐使用putIfAbsent、computeIfAbsent、merge等原子方法避免显式同步,合理设置初始容量和并发等级以减少扩容开销,并注意复合操作需用内置方法保证原子性,防止竞态条件。
-
反射无法直接从泛型数组变量中提取组件类型,因运行时仅保留原始类型;仅字段声明、方法签名等编译期固化位置可获取完整泛型信息,局部变量和new表达式中的泛型数组则完全不可恢复。
-
Runtime.addShutdownHook实现优雅停机的核心是将线程池、数据库连接、文件流、网络通道及临时缓存等需手动管理的资源绑定到JVM关闭流程中,通过静态变量引用并在钩子内按序执行shutdown()、awaitTermination()、close()、flush()、clear()等清理操作,避免资源泄漏。
-
GZIPOutputStream用于网络传输前动态压缩数据流,需正确包装、调用finish()、确保接收端支持解压;适合文本等高冗余数据,对JPEG等已压缩格式无效;HTTP需设Content-Encoding:gzip,Socket需双方约定协议。
-
Java对象内存布局由对象头(MarkWord和ClassPointer)、实例数据区(字段重排序)和对齐填充三部分组成;数组对象额外包含4字节length字段;对象大小需满足8字节对齐,最小为16字节。
-
Java中(T[])newObject[n]必然抛ClassCastException,因泛型擦除使运行时只剩Object[],而数组协变性与JVM类型检查在赋值或首次按T[]使用时触发异常;安全方案是用List<T>、传模板数组或反射Array.newInstance。