Java面试题更新 2026-08-03

能否解释一下 Java 中 StampedLock 的设计原理与适用场景?

考察说明

考查对 Java 并发锁机制,特别是 StampedLock 的读写锁增强和乐观读的理解。

回答思路

  1. 【回答框架 1】StampedLock 是 Java 8 引入的并发工具,位于 java.util.concurrent.locks 包,提供读锁、写锁和乐观读三种模式。写锁是排他锁,读锁是共享锁,乐观读不真正加锁,但通过 stamp 版本号验证数据一致性。
  2. 【回答框架 2】与 ReentrantReadWriteLock 相比,StampedLock 支持乐观读,在读多写少场景下能提升吞吐量,因为乐观读无需 CAS 操作。但 StampedLock 不可重入,且不支持条件变量,使用时需注意。
  3. 【回答框架 3】典型使用模式:先尝试乐观读获取 stamp,若数据有效则直接使用;若无效则升级为读锁或写锁。在写操作时,可使用 tryConvertToWriteLock 进行锁升级,避免重复获取锁。
  4. 【回答框架 4】StampedLock 适用于读多写少的并发场景,如缓存、配置读取等。但在高竞争或写操作频繁时,乐观读可能频繁失败,导致性能下降,需根据实际场景权衡。
  5. 【回答框架 5】使用 StampedLock 必须小心死锁和锁泄漏,每个锁操作后需在 finally 中释放,且要确保 stamp 的一致性。
  6. 【关键点 1】StampedLock 提供三种锁模式:写锁、读锁和乐观读。
  7. 【关键点 2】乐观读不阻塞写操作,通过 stamp 验证数据有效性。
  8. 【关键点 3】StampedLock 不可重入,也不支持 Condition。
  9. 【关键点 4】适用于读多写少场景,可提升并发性能。
  10. 【易错点 1】忽略 stamp 验证,可能导致数据不一致。
  11. 【易错点 2】在持有锁时调用阻塞操作,可能引发死锁。
  12. 【易错点 3】乐观读失败后未正确升级锁,导致并发问题。