Java面试深度解析:ThreadLocal与垃圾回收

需积分: 5 14 下载量 28 浏览量 更新于2024-08-04 收藏 32KB DOCX 举报
Java面试题常常关注核心概念和最佳实践,包括并发控制、垃圾收集、以及Spring框架的应用。以下是对这些关键知识点的详细解释: **ThreadLocal** ThreadLocal是Java中一个非常有用但经常被误解的工具,它提供了线程局部变量,也就是说,每个线程都有它自己的变量副本,互不影响。ThreadLocal内部通过一个线程相关的Map来存储每个线程的变量副本,键是线程对象,值是变量副本。在Spring框架中,ThreadLocal被广泛用于管理Request作用域的Bean,确保每个请求有自己的独立实例,避免在多线程环境下出现数据污染。 **Java垃圾收集(GC)** Java的垃圾收集机制自动回收不再使用的内存,以防止内存泄漏。GC主要关注三个问题:“在什么时候”、“对什么东西”、“做什么”。 1. **在什么时候**:GC启动的时机主要有三种: - Eden区满时触发Minor GC,清理新生代。 - 老年代空间不足,无法容纳新生代晋升的对象时触发Major或Full GC。 - System.gc()被显式调用(尽管不推荐)。 2. **对什么东西**:GC主要清理的是那些不可达的对象,即从GC Roots出发无法到达的对象。GC Roots包括虚拟机栈中的引用、方法区的静态属性引用、本地方法栈中JNI引用的对象。 3. **做什么**:根据不同的内存区域,GC有不同的策略: - 新生代:通常使用复制算法,将存活对象移动到另一块空间,清空原空间。 - 老年代:可能采用标记-清除或标记-压缩算法,以减少碎片。 - 永久代(在较新的JVM版本中已替换为元空间):存储类元数据和类加载器。 **Synchronized与Lock** - **Synchronized** 是一种内置的、非公平的、独占式的锁,属于悲观锁。它确保同一时刻只有一个线程访问同步代码块,用于实现线程安全。Synchronized可以作用于方法或代码块,具备可重入性,意味着一个线程可以多次进入它已获得锁的同步代码。 - **Lock** 是Java.util.concurrent包下的接口,提供了比synchronized更细粒度的锁控制,如ReentrantLock(可重入锁)。Lock通常需要手动获取和释放,允许尝试获取锁(tryLock)、中断等待、以及锁的公平性设置。Lock相比synchronized更灵活,但使用不当可能导致死锁。 在面试中,理解并能详细解释这些概念是展示Java基础和并发控制能力的关键。同时,面试者还需要掌握如何在实际项目中合理使用这些工具和机制,以优化程序性能和保证线程安全。