跳过正文

Java

Spring AOP 原理

·291 字·2 分钟
AOP 这东西,说难不难说简单不简单 # AOP,面向切面编程。第一次听到这个词的时候我满脸问号——什么切面?切什么? 后来我换了个理解方式就通了:你有一堆业务方法,想在每个方法执行前后都打个日志,怎么办?一个个方法里加 log.info()?那要是有 200 个方法呢?改到吐。AOP 就是帮你把这种"横切"的逻辑抽出来,统一处理。 什么是 AOP,为什么需要它 # OOP 的核心是纵向的继承和封装,但有些逻辑是横向的——日志、事务、权限校验,跟具体业务没关系,但到处都要用。如果每个方法都写一遍,代码重复不说,后续改起来也要命。

JVM 垃圾回收机制

·167 字·1 分钟
JVM 垃圾回收看这篇就够了 # JVM 垃圾回收是面试八股文里的重头戏,也是我觉得最难啃的一块。概念多、算法多、收集器也多,第一次看的时候感觉脑子不够用。这篇把我学到的整理一下,尽量讲人话。 堆内存长什么样 # JVM 的堆分两大块:新生代(Young Generation)和老年代(Old Generation)。

Spring IOC 容器原理

·253 字·2 分钟
Spring IOC 到底干了啥 # 学 Spring 的时候,IOC(控制反转)这个词听了不下一百遍。老师讲、教程讲、面试题也讲。但我一开始真没搞懂这玩意到底在干嘛——不就是 new 一个对象吗,为啥要搞得这么复杂? 后来写项目写多了才明白,Spring 的 IOC 容器本质上就是帮你管理对象的。你不用自己 new,它帮你 new,帮你组装,帮你销毁。听着简单,但里面门道挺多的。 Bean 生命周期——从出生到死亡 # 一个 Bean 从创建到被 GC 回收,中间经历了不少事。大致流程是这样:

Java 线程池原理与实践

·214 字·2 分钟
线程池这玩意,用不好真的会出事 # 上周实验室项目出了个线上问题,排查了一下午发现是线程池配置不对导致的 OOM。这事让我意识到,线程池看着简单,用不好是真会出事的。 为什么要用线程池 # 你可能觉得,new 一个 Thread 跑任务不就完了?能跑,但有几个问题:

单例模式的几种写法

·273 字·2 分钟
单例模式的几种写法,你用哪种? # 为什么需要单例 # 单例模式大概是最简单也最常被问到的设计模式了。面试必问,但你真的理解每种写法的区别吗? 先说为什么需要单例。有些对象全局只需要一个就够了,比如线程池、数据库连接池、配置管理器。你不希望到处 new,浪费资源不说,状态不一致更头疼。

ConcurrentHashMap 线程安全原理

·223 字·2 分钟
ConcurrentHashMap 到底怎么保证线程安全的 # 上篇写了 HashMap,有同学私信问我 ConcurrentHashMap 和 HashMap 有什么区别。其实吧,区别大了去了,JDK8 的 ConcurrentHashMap 基本是重写的,跟 JDK7 完全两个思路。 花了差不多一周把源码理清楚,这篇来聊聊它到底怎么在并发场景下保证线程安全。 JDK7 的 Segment 分段锁 # 先说 JDK7 的方案,面试还是会问。

HashMap 源码笔记

·347 字·2 分钟
HashMap 源码我读了三遍才看懂 # 大二下学期面试实习的时候,面试官问我 HashMap 的底层原理,我支支吾吾说了个"数组加链表"就说不下去了。回来之后就下定决心要把源码读一遍。结果读了三遍才算真正搞明白,这玩意比我想象的要精妙得多。 先说说 HashMap 的内部结构 # 你打开 HashMap 的源码,会看到一个叫 Node<K,V>[] table 的数组。这就是 HashMap 的骨架。