ReadWriteLock和StampedLock都是Java中用于控制并发访问的锁机制,它们相较于传统的排它锁(比如ReentrantLock)在某些场景下能够提供更好的性能和灵活性。
1. ReadWriteLock(读写锁):
ReadWriteLock 接口包含两个锁:读锁和写锁,多个线程可以同时获取读锁,但只有一个线程可以获取写锁。只有在没有其他线程持有写锁的情况下,读锁才可以被获取。这样的设计使得在读多写少的场景下,能够提高并发性能。
读锁之间是可重入的,即同一个线程可以多次获取读锁,而不会造成死锁。写锁是排它的,只有一个线程可以持有写锁,防止对共享资源的并发写入。
2. StampedLock(标记锁):
StampedLock 是Java 8中引入的一种更为高级的锁机制。与 ReadWriteLock 相比,StampedLock 提供了更灵活的并发控制。
StampedLock 支持乐观读锁(optimistic read lock),这意味着在获取乐观读锁时,不会阻塞其他线程持有写锁或悲观读锁的操作。在对共享资源进行后续操作之前,需要检查读锁是否仍然有效,如果有效,可以继续操作;如果失效(其他线程持有写锁),则需要重试或进行其他处理。
StampedLock 还提供了一种转化锁的模式,可以从乐观读锁转换为写锁或悲观读锁。转换锁的模式可以减少锁的竞争和切换开销。
需要注意的是,StampedLock不能重入,即同一个线程在持有写锁或悲观读锁时,再次获取写锁或悲观读锁时会导致死锁。
总的来说,ReadWriteLock适用于读多写少的场景,并可以提高并发性能;而StampedLock则提供了更高级的灵活性和乐观读锁的支持,适用于读写操作交替频繁且对数据一致性要求不是非常高的场景。在使用时需要根据具体场景选择合适的锁机制。