AQS (AbstractQueuedSynchronizer) 是 Java 并发包的核心同步工具,许多高级同步器如 ReentrantLock、Semaphore 等都是基于它实现的。AQS 维护一个 `volatile` 状态 `state` 和一个 CLH 等待队列(双向链表,由 `Node` 类表示),用于管理对共享资源的访问。 AQS 支持独占模式(`acquire()`/`release()`)和共享模式(`acquireShared()`/`releaseShared()`)。子类通过重写 `tryAcquire()`、`tryRelease()` 等方法来定义获取和释放资源的具体逻辑,AQS 负责处理排队、阻塞和唤醒等底层操作。 `Node` 类封装了线程、前驱/后继节点指针以及等待状态,用于构建等待队列。等待状态包括 `CANCELLED`、`SIGNAL`、`CONDITION` 和 `PROPAGATE`,用于控制线程的阻塞和唤醒。 文章以自定义 `Mutex`(独占锁)为例,展示了如何继承 AQS 构建同步器,并分析了 `acquire()`、`addWaiter()` 和 `enq()` 等核心方法的源码,揭示了 AQS 如何实现线程的排队等待和公平/非公平锁的机制。例如,`acquire()`尝试获取锁,失败则加入等待队列,`addWaiter()`将线程封装成Node加入队列尾部,`enq()`保证节点被正确插入队列。

isAssignableFrom()方法和instanceof关键字都用于类型判断,但侧重点不同。isAssignableFrom()从类继承关系角度判断,判断一个类是否为另一个类的父类或接口,调用者和参数均为Class对象。instanceof则从实例角度判断,判断一个实例是否属于某个类或其父类。 简单来说,`父类.class.isAssignableFrom(子类.class)`为真,而`子类实例 instanceof 父类`也为真。isAssignableFrom()主要用于类之间的关系校验,而instanceof用于运行时检查对象的实际类型。通过示例代码,文章展示了两者在接口和类继承场景下的不同应用和结果。

Spring AOP通过动态代理机制实现,分为JDK Proxy和CGLIB两种方式。若目标对象实现接口,则使用JDK Proxy创建代理;若未实现接口,则采用CGLIB生成子类作为代理。代理对象与实现类功能相同,通过横向机制在不修改源代码的情况下增强功能,实现AOP的核心思想。

JVM中的RTTI(运行时类型识别)和反射都是在程序运行时获取类型信息的重要机制。RTTI允许在运行时识别对象的类型,并获取其接口、父类、方法等信息,依赖于JVM类加载器加载Class对象。获取Class对象引用主要通过`Class.forName()`和`.class`两种方式,前者立即加载,后者延迟加载。 而反射则更进一步,能够在编译时完全未知类型的对象进行操作。它允许程序在运行时动态地获取和操作类的信息,例如方法和构造器,从而创建和使用在编译时未知的对象。 核心区别在于:RTTI处理的类型在编译时已知,编译器会检查`.class`文件;而反射处理的类型在编译时未知,`.class`文件在运行时动态加载和检查。反射为动态编程提供了强大的能力,但同时也带来了一定的性能开销。

`getField` 和 `getDeclaredField` 都是 Java 反射机制中用于获取字段的方法,但存在关键区别。`getField` 只能获取公共(public)字段,包括从父类继承的字段,而 `getDeclaredField` 可以获取本类所有字段,包括私有(private)字段,但不包含继承的字段。 尽管 `getDeclaredField` 可以获取私有字段,但默认情况下无法访问其值,需要通过 `setAccessible(true)` 暴力反射来绕过访问权限限制。 反射技术具有灵活性和扩展性强的优点,但也存在性能较低、安全性风险以及破坏封装性的缺点。示例代码演示了如何使用这两个方法获取并修改 `Person` 类的公共和私有字段的值。