Java 8 到 21 核心新特性概览
大部分团队还在用 Java 8,但 Java 已经迭代到 21 了。本文聚焦互联网后端开发最实用的 10 个新特性,每个都包含代码示例。 一、Lambda 与 Stream(Java 8) 1.1 Lambda 表达式的语法与函数式接口 1.2 Stream 的 map/filter/reduce 操作 1.3 Collectors 常用方法 1.4 并行 Stream 的适用条件 二、Optional——消灭 NullPointerException(Java 8) 2.1 of() / ofNullable() / empty() 2.2...
Java IO 模型演进
从最早的阻塞 IO 到如今高性能网络框架 Netty,Java IO 模型的演进代表了网络编程思想的一次次革命。 一、前置知识:用户态与内核态 1.1 系统调用与上下文切换的代价 1.2 同步/异步、阻塞/非阻塞的区分 1.3 两对概念的交叉矩阵 二、BIO(Blocking IO) 2.1 ServerSocket + Socket 的工作原理 2.2 一连接一线程模型的弊端——C10K 问题 2.3 线程池的缓解——但治标不治本 2.4 BIO 的适用场景——连接数少、数据量大的场景 三、NIO(Non-blocking IO / New IO)...
ArrayList 与 LinkedList 对比
ArrayList 随机访问快、插入慢?LinkedList 插入快、查找慢?这是真的吗?我们用 JMH 实测数据说话。 一、集合选型的常见误区 1.1 “频繁插入删除用 LinkedList”——真的是这样吗 1.2 “随机访问用 ArrayList”——没错,但有多快 1.3 内存占用方面很多人忽略了 二、底层数据结构对比 2.1 ArrayList——Object[] 数组,连续内存 2.2 LinkedList——双向链表 Node,非连续内存 2.3 内存布局图示 三、JMH 基准测试设置 3.1 JMH 简介与基本注解 3.2 测试环境说明(JDK 版本、JVM 参数...
HashMap 红黑树化原理
面试必问 HashMap,但你真的理解它的进化机制吗?从数组 + 链表到红黑树,JDK 8 的这次升级解决了什么问题? 一、HashMap 的数据结构演进 1.1 JDK 7:数组 + 单向链表 1.2 JDK 8:数组 + 链表 + 红黑树 1.3 为什么需要红黑树——哈希碰撞攻击 二、put() 方法源码全解析 2.1 hash() 扰动函数——为什么是 (h ^ h>>>16) 2.2 定位桶位置——(n-1) & hash 2.3 链表插入——尾插法(JDK 8)vs 头插法(JDK 7) 2.4 树化条件——链表长度 ≥ 8 且桶数量 ≥ 64 ...
线程池参数配置指南
Executors.newFixedThreadPool() 阿里规范不让用,newCachedThreadPool() 可能导致 OOM。那么线程池到底该怎么配?本文从源码到生产实践,给出计算公式和配置模板。 一、线程池的 8 个参数 1.1 corePoolSize——核心线程数 1.2 maximumPoolSize——最大线程数 1.3 keepAliveTime——空闲线程存活时间 1.4 unit——时间单位 1.5 workQueue——工作队列 1.6 threadFactory——线程工厂 1.7 handler——拒绝策略 1.8 参数之间的协作关系——任务提交后...
ThreadLocal 内存泄露与最佳实践
几乎所有 Java 项目都在用 ThreadLocal 存储上下文信息,但很多人不知道它可能造成内存泄漏——而且是在你”原本以为不会”的场景下。 一、ThreadLocal 的设计初衷 1.1 线程隔离的数据存储——每个线程一份独立副本 1.2 典型使用场景——数据库连接、Session、事务上下文、链路追踪 TraceId 二、ThreadLocal 的底层结构 2.1 Thread → ThreadLocalMap → Entry(弱引用包装的 ThreadLocal 作为 key) 2.2 ThreadLocalMap 的数据结构——线性探测法解决哈希冲突 2.3 Entry...
AQS 并发包原理
ReentrantLock、Semaphore、CountDownLatch、ReentrantReadWriteLock……它们底层都依赖 AQS。理解 AQS,就理解了 Java 并发工具的设计灵魂。 一、AQS 是什么 1.1 AbstractQueuedSynchronizer——基于 FIFO 等待队列的同步框架 1.2 设计模式:模板方法模式 1.3 核心三要素:state 状态、CLH 队列、Condition 条件队列 二、state——同步状态的原子管理 2.1 volatile int state + CAS 的原子操作 2.2 getState() /...
volatile 可见性与有序性原理
volatile 是 Java 并发编程的”轻量级”同步机制。它真的轻吗?从 CPU 缓存一致性到指令重排序,一篇文章说清楚。 一、为什么要理解 JMM 1.1 物理机缓存模型——CPU → L1/L2/L3 Cache → 主存 1.2 缓存一致性问题——MESI 协议简介 1.3 Java 内存模型(JMM)抽象——主内存 vs 工作内存 1.4 JMM 解决什么——原子性、可见性、有序性 二、volatile 的可见性 2.1 写 volatile 变量——立即刷回主内存 2.2 读 volatile 变量——强制从主内存读取 2.3 一个可见性问题的代码...
synchronized 锁升级原理
从 JDK 1.5 到 JDK 21,synchronized 经历了从”性能杀手”到”首选锁”的逆袭。它的进化背后,是 JVM 对锁优化的极致追求。 一、synchronized 的三种形式 1.1 修饰普通方法——锁当前实例 1.2 修饰静态方法——锁 Class 对象 1.3 修饰代码块——锁指定对象 1.4 字节码层面:ACC_SYNCHRONIZED 标志 vs monitorenter/monitorexit 二、Monitor 机制——重量级锁的底层 2.1 ObjectMonitor 结构:_owner / _EntryList / _...
类加载与双亲委派
为什么 JDBC 驱动不需要 Class.forName() 了?为什么同一个 jar 包在两个 ClassLoader 中加载会报 ClassCastException?答案都在类加载机制里。 一、类加载的 7 个阶段 1.1 加载 → 验证 → 准备 → 解析 → 初始化 → 使用 → 卸载 1.2 哪些阶段是交叉进行的 1.3 类加载的触发时机——主动引用 vs 被动引用 二、类加载器层次结构 2.1 Bootstrap ClassLoader——加载 <JAVA_HOME>/lib 2.2 Extension ClassLoader(JDK 8)→ Platfo...