Java并发编程面试焦点:CAS、volatile与线程安全

需积分: 10 4 下载量 60 浏览量 更新于2024-08-13 收藏 7.27MB DOC 举报
"这是一份2021年的Java高级面试题,涵盖了并发编程相关的概念,包括volatile关键字、Java内存模型(JMM)、Compare and Swap(CAS)操作、Unsafe类、AtomicInteger类以及并发集合如ArrayList和Vector的区别。" 1、volatile关键字 volatile是Java中的轻量级同步机制,它提供了可见性和部分有序性保证。当一个变量被声明为volatile时,其他线程在读取该变量时能立即看到最新值,但不保证原子性。它可以防止指令重排序,确保多线程环境下的正确性。例如,在双重检查锁定单例模式中,volatile可以避免指令重排导致的安全隐患。 2、Java内存模型(JMM) JMM定义了线程和主内存之间的交互规则,确保多线程环境下的数据一致性。它保证了可见性(一个线程对共享变量的修改对其他线程可见)、原子性(某些操作不可分割)和有序性(限制指令重排序)。JMM的存在是为了处理处理器优化带来的潜在问题。 3、Compare and Swap(CAS) CAS是一种无锁算法,通过比较并交换值来实现原子操作。在Java中,Unsafe类提供了CAS操作,它是基于CPU的原子指令实现的。例如,AtomicInteger的getAndIncrement方法就是通过CAS来实现自增操作的:先将主内存的值加载到工作内存,然后比较预期值与实际值,如果相等则更新,并将新值写回主内存,否则重试。 4、Unsafe类 Unsafe类位于`sun.misc`包下,提供了对底层操作的访问,包括内存访问、CAS操作等。由于其内部方法直接操作内存,因此不保证线程安全,开发者需要谨慎使用。 5、CAS的优缺点 优点:CAS避免了锁的开销,减少了同步的性能影响。缺点:循环时间长可能导致性能下降,因为如果多个线程尝试更新同一个变量且值不匹配,会持续循环尝试。此外,CAS无法处理“ABA”问题,即值从A变到B再变回A,可能导致逻辑错误。 6、ABA问题及其解决方案 ABA问题是指在多线程环境下,一个变量从A变为B,然后又变回A,而CAS可能误认为值从未改变。解决方法包括使用AtomicReference,它比较的是对象引用的地址,或者使用AtomicStampedReference,它附带了一个版本戳,能检测到值的变化。 7、ArrayList与Vector、ConcurrentModificationException ArrayList在添加元素时(add方法)不加锁,所以在多线程环境下修改可能会导致`ConcurrentModificationException`。相对地,Vector是线程安全的,每个方法都使用`synchronized`修饰。另外,`Collections.synchronizedList()`可以将普通列表转换为线程安全的列表,但需要注意并发修改问题。 总结,这份面试题涵盖了Java并发编程的核心概念,对于理解Java多线程编程的机制和实践非常有帮助。了解这些知识点可以帮助开发者编写出更高效、线程安全的代码。