interview
java-concurrency
什么是Java的StampedLock?

Java并发面试题, 什么是 Java 的 StampedLock?

Java并发面试题, 什么是 Java 的 StampedLock?

QA

Step 1

Q:: 什么是 Java 的 StampedLock?

A:: StampedLock 是 Java 8 引入的一种新的锁机制,旨在替代传统的读写锁 (ReadWriteLock)。它通过乐观读锁和悲观读锁来提供更高的并发性能。StampedLock 提供了三种模式的锁:写锁、悲观读锁和乐观读锁。写锁和悲观读锁类似于传统的读写锁,而乐观读锁则允许线程在不加锁的情况下读取数据,并在读取完成后检查数据是否被修改,从而减少锁争用,提高性能。

Step 2

Q:: StampedLock 的优缺点是什么?

A:: StampedLock 的优点包括高并发性能、减少锁争用、支持乐观读锁等。缺点是使用复杂度较高,不支持重入锁,且没有条件变量 (Condition) 支持。

Step 3

Q:: 如何使用 StampedLock 实现一个线程安全的计数器?

A::

 
import java.util.concurrent.locks.StampedLock;
 
public class Counter {
    private int count = 0;
    private final StampedLock lock = new StampedLock();
 
    public void increment() {
        long stamp = lock.writeLock();
        try {
            count++;
        } finally {
            lock.unlockWrite(stamp);
        }
    }
 
    public int getCount() {
        long stamp = lock.tryOptimisticRead();
        int currentCount = count;
        if (!lock.validate(stamp)) {
            stamp = lock.readLock();
            try {
                currentCount = count;
            } finally {
                lock.unlockRead(stamp);
            }
        }
        return currentCount;
    }
}
 

Step 4

Q:: 什么时候选择使用 StampedLock 而不是 ReentrantReadWriteLock?

A:: 在读操作远多于写操作的场景下,且要求较高的并发性能时,选择使用 StampedLock。它通过乐观读锁可以显著减少锁争用,提高性能。但如果需要重入锁特性或者条件变量,ReentrantReadWriteLock 会更合适。

Step 5

Q:: 乐观读锁的使用场景是什么?

A:: 乐观读锁适用于读取频繁但修改较少的场景。通过乐观读锁,读取操作可以在无锁的情况下进行,仅在需要验证数据一致性时加锁,从而显著提升并发性能。例如,缓存系统中读取数据的操作。

用途

面试 Java 并发编程的相关内容,特别是 StampedLock,旨在考察候选人对并发控制的理解和应用能力。StampedLock 提供了较传统锁机制更高的性能和更细粒度的控制,这在高并发场景下尤为重要。在实际生产环境中,尤其是在需要频繁读写但读操作远多于写操作的情况下,如缓存系统、计数器等,使用 StampedLock 能有效提升系统性能,减少锁争用。\n

相关问题

🦆
什么是 ReentrantLock?

ReentrantLock 是 Java 中的一种重入锁,提供与 synchronized 相同的互斥功能,但比 synchronized 更灵活。它支持公平锁和非公平锁、可中断的锁获取、超时锁获取等特性。

🦆
什么是 ReadWriteLock?

ReadWriteLock 是一种分离读写操作的锁,允许多个读线程同时访问,但写线程独占访问。典型的实现类是 ReentrantReadWriteLock。

🦆
如何使用 ReentrantReadWriteLock?
 
import java.util.concurrent.locks.ReentrantReadWriteLock;
 
public class Counter {
    private int count = 0;
    private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
 
    public void increment() {
        lock.writeLock().lock();
        try {
            count++;
        } finally {
            lock.writeLock().unlock();
        }
    }
 
    public int getCount() {
        lock.readLock().lock();
        try {
            return count;
        } finally {
            lock.readLock().unlock();
        }
    }
}
 
🦆
什么是 CASCompare And Swap?

CAS 是一种原子操作,通过比较和交换来实现无锁并发控制。CAS 操作包括三个参数:内存位置、期望值和新值。只有当内存位置的当前值等于期望值时,才会将其更新为新值。CAS 常用于实现无锁算法,如 Atomic 类。

🦆
什么是 Volatile 关键字?

volatile 关键字用于声明变量的值可能会被多个线程修改,并且每次读取变量时都从主内存中读取,而不是从线程的缓存中读取。它保证了变量的可见性,但不保证原子性。