本文系统阐述了 Java 多线程的关键实现与机制。通过 join() 可让主线程等待子线程结束;线程阻塞的情形包括 sleep、阻塞 I/O、获取已被占有的监视器、等待 notify 以及 suspend(易死锁)。比较了 synchronized(JVM 层实现、自动释放、不可中断、非公平)与 Lock(代码层实现、需手动释放、可设超时、可中断、支持公平/读写锁)。深入解析了 synchronized 的 monitorenter/monitorexit 指令及其在方法上的 ACC_SYNCHRONIZED 标记,并说明了其可修饰静态方法(锁为 Class 对象)。介绍了 ReentrantLock 基于 AQS 的独占模式实现及公平/非公平策略的差别。若不使用上述锁,可采用 volatile、原子类、ThreadLocal 或不可变对象保证安全。最后区分了乐观锁(CAS)与悲观锁(synchronized/Lock),并说明了锁的升级路径:无锁→偏向锁→轻量级锁→重量级锁。

本文系统阐述了 Java 并发工具包 JUC 的组成及功能,包括原子类、锁与条件变量、线程池、阻塞队列、并发容器和同步器,并深入解释了 AQS 的设计原理、状态管理和常见实现(如 ReentrantLock、Semaphore、读写锁等)。随后介绍了 LongAdder 通过分段计数提升高并发计数性能的机制,以及 ThreadLocal 的实现细节、哈希冲突处理和典型应用场景。最后详细说明了线程池的类型、工作流程、五种状态转换、常用拒绝策略以及针对 CPU 密集型、IO 密集型任务的队列大小设置原则。

JVM 由类加载器、运行时数据区、执行引擎和本地接口四部分组成。类加载器把 .class 文件装入内存,运行时数据区包括栈、堆、方法区、程序计数器和本地方法栈;执行引擎解释字节码并调用本地接口。JVM 启动先定位 JRE、装载 JVM 动态库、创建 JNIEnv,随后运行主类或指定的 class。Java 程序经编译生成字节码,加载、实例化后由解释器或 JIT 转为操作系统指令执行。程序计数器负责线程的指令流控制,本地方法栈服务 native 方法。内存划分为程序计数器、虚拟机栈、本地方法栈、堆、方法区(含运行时常量池)及直接内存。类信息存放在方法区,局部变量存于虚拟机栈的栈帧。类加载经历加载、验证、准备、解析、初始化等阶段。

文章系统阐述了JVM 垃圾回收的触发时机、Full GC 的减少措施以及对象可回收性的判定方法,说明对象在新生代经历 Eden、Survivor 区的年龄计数后晋升老年代的机制,并比较了标记‑清除、标记‑复制、标记‑整理等算法的优缺点。进一步介绍了分代收集的必要性,重点解析了 G1 与 CMS 两大收集器的工作原理、优势与局限。最后区分了内存泄漏与内存溢出并给出防治建议。

本文围绕 MySQL 常用 SQL 技巧展开,重点介绍了分页查询的 LIMIT 用法及大偏移优化(索引覆盖、延迟关联、书签查询),常见聚合函数 COUNT、AVG、SUM、MAX、MIN 的作用与 GROUP BY 配合使用方法;阐述了表之间的内连接、外连接(左、右)及等值连接的语法与一对多、多对多、自关联的实现思路;说明了行转列的两种实现手段(CASE…WHEN 与 IF),并分析了 SQL 注入的原理、危害及防御措施(参数校验、预编译);给出关联更新的基本写法;最后比较了 WHERE 与 HAVING 的定位、使用时机及性能差异。

MySQL索引是存于磁盘的引用结构,采用BTREE或HASH实现,可加速查询、唯一约束、排序、连接等操作。索引类型包括普通、唯一、主键、组合、全文、空间等。创建方式有CREATE TABLE、ALTER TABLE、CREATE INDEX,可通过EXPLAIN检查是否生效。使用索引需遵守最左前缀原则,避免在频繁更新、低基数或小表上建索引。MyISAM索引仅存记录地址,InnoDB采用聚簇索引,辅助索引指向主键。HASH适合等值查询,BTREE支持范围和排序。索引过多会影响写入,需定期评估并重建。