基于 JDK 8+ 的 JVM 类加载机制深度解析。
一、类加载概述

1.1 什么是类加载
类加载是指将 .class 文件中的字节码读入内存,并为之创建对应的运行时数据结构的过程。
基于 JDK 8+ 的 JVM 类加载机制深度解析。

类加载是指将 .class 文件中的字节码读入内存,并为之创建对应的运行时数据结构的过程。
基于 JDK 8+ 的 JVM 对象创建过程与内存布局深度解析。

当执行 new Demo() 时,JVM 会依次执行以下步骤:
new Demo()
│
┌─────────────┴─────────────┐
│ 1. 类加载检查 │
├───────────────────────────┤
│ 2. 分配内存 │
├───────────────────────────┤
│ 3. 初始化零值 │
├───────────────────────────┤
│ 4. 设置对象头 │
├───────────────────────────┤
│ 5. 执行 <init> 方法 │
└───────────────────────────┘
│
▼
对象创建完成
基于 JDK 8+ 的 JVM 垃圾回收机制深度解析。
GC 要解决三个核心问题:
| 问题 | 说明 |
|---|---|
| 哪些内存需要回收? | 判断对象是否存活 |
| 什么时候回收? | GC 触发时机 |
| 如何回收? | 垃圾回收算法和收集器 |
基于 JDK 8+ 的 JVM 运行时数据区深度解析。

一句话总结:堆管存储,栈管运行。
基于 JDK 1.8+ 的 synchronized 关键字深度解析。
synchronized 是什么?
Java 内置的关键字,用于实现线程同步,本质是对象锁(Monitor Lock)。
提供的三大特性:
| 特性 | 说明 |
|---|---|
| 原子性 | 同步块内的操作要么全部执行,要么全部不执行 |
| 可见性 | 释放锁时,将工作内存刷回主内存;获取锁时,从主内存重新读取 |
| 有序性 | 同一时刻只有一个线程执行同步块,表现为串行 |
基于 JDK 1.8 源码的 CountDownLatch 核心原理分析。
CountDownLatch 是基于 AQS 共享模式(Shared Mode)实现的同步辅助类,用于协调多个线程之间的执行顺序。核心语义:一个或多个线程阻塞等待,直到其他线程完成一系列操作后释放。
| 场景 | 描述 | 模型 |
|---|---|---|
| 多等一 | 多个工作线程等待一个信号,如压测时统一发令 | 主线程 countDown,工作线程 await |
| 一等多 | 一个线程等待多个任务完成,如主线程等待资源初始化 | 工作线程 countDown,主线程 await |
基于 JDK 1.8 源码的 CyclicBarrier 核心原理分析。
可重置特性:当所有线程到达栅栏点后,栅栏自动重置为初始状态,可供下一轮同步使用。这与 CountDownLatch 的一次性设计形成鲜明对比。
同步语义:阻拦线程直到满员。所有参与线程必须到达栅栏点后,才能统一放行。
// 5 个线程,在栅栏点汇合
CyclicBarrier barrier = new CyclicBarrier(5, () -> {
System.out.println("全员到齐,开始下一阶段");
});
for (int i = 0; i < 5; i++) {
new Thread(() -> {
doPhase1();
barrier.await(); // 等待其他线程
doPhase2();
}).start();
}
基于 JDK 1.8 源码的读写锁核心原理分析。
假设你有一个缓存,100 个线程读,1 个线程偶尔写。如果用 ReentrantLock:
// 悲剧:读也要排队!
lock.lock();
try {
return cache.get(key); // 明明只是读,也要等锁
} finally {
lock.unlock();
}
基于 JDK 1.8 源码的 Semaphore 核心原理分析。
Semaphore 是基于 AQS 共享模式(Shared Mode)实现的流量控制工具,用于限制同时访问特定资源的线程数量。
停车场容量:3 个车位(permits = 3)
车辆1 进场 → permits = 2
车辆2 进场 → permits = 1
车辆3 进场 → permits = 0
车辆4 进场 → permits < 0,排队等待
车辆1 离场 → permits = 1 → 唤醒车辆4
待定,暂时先不看这个邮戳锁,后面再来细细研究!