1. 集合框架
1.1. ConcurrentHashMap
和 HashMap
有什么区别?
HashMap
:线程不安全,适用于单线程环境。ConcurrentHashMap
:线程安全,适用于多线程环境,使用分段锁机制来提高并发性能。
1.2. TreeSet
如何实现排序?
TreeSet
使用 Red-Black
红黑树来存储元素,并根据元素的自然顺序或 Comparator
来排序。
1.3. 什么是 fail-fast
和 fail-safe
?
fail-fast
:当集合在遍历时被修改,会抛出ConcurrentModificationException
,如ArrayList
。fail-safe
:当集合在遍历时被修改,不会抛异常,创建的是集合的副本,如ConcurrentHashMap
。
2. 多线程与并发
2.1. 如何实现线程安全?
可以使用以下方式实现线程安全:
synchronized
关键字- 使用
Lock
接口,如ReentrantLock
- 使用
volatile
关键字保证变量的可见性 - 使用并发集合类(如
ConcurrentHashMap
)
2.2. 什么是线程饥饿?
线程饥饿发生在某些线程长时间得不到 CPU 资源,无法执行,通常是由于其他线程占用了过多的资源或线程优先级不合理。
2.3. 解释 synchronized
和 ReentrantLock
的区别。
synchronized
:隐式锁,简单易用,无法手动释放锁。ReentrantLock
:显式锁,提供更多功能,如锁的可重入、等待时间等,手动获取和释放锁。
2.4. 什么是死锁?如何避免死锁?
死锁是指两个或多个线程相互等待对方释放锁,导致所有线程都无法继续执行。避免死锁的方法有:
- 避免嵌套锁。
- 尝试使用
tryLock
限定获取锁的时间。 - 遵循固定的锁顺序。
3. JVM 与性能调优
3.1. 如何分析和优化 JVM 性能?
可以使用以下工具分析和优化 JVM 性能:
jstack
:分析线程堆栈信息。jmap
:生成堆内存转储文件(Heap Dump)。jstat
:监控 GC 的活动和内存使用情况。VisualVM
或JProfiler
:分析 CPU 和内存使用情况。
3.2. 什么是类加载机制?类加载器有哪些?
类加载机制负责将类文件加载到 JVM 中。类加载器有以下三种:
- 引导类加载器(Bootstrap ClassLoader):加载核心类库。
- 扩展类加载器(Extension ClassLoader):加载扩展类库。
- 应用程序类加载器(Application ClassLoader):加载用户定义类。
3.3. 解释 JVM 的内存模型。
JVM 内存模型分为以下几个区域:
- 堆(Heap):存储对象实例。
- 栈(Stack):每个线程都有自己的栈,存储局部变量和方法调用信息。
- 方法区(Method Area):存储类的元数据、静态变量、常量池。
- 程序计数器(Program Counter):每个线程都有自己的程序计数器,记录当前线程执行的字节码指令位置。
想要更大提升,点击免费使用小奈AI