【JAVA】谈谈 ReadWriteLock 和 StampedLock

简介: 【JAVA】谈谈 ReadWriteLock 和 StampedLock

121a265853904e77a9dcd4f99e9f0b1e.png

前言

在多线程编程中,对共享资源的读写操作是一个常见的挑战。Java并发包中提供了ReadWriteLockStampedLock两种灵活的锁机制,分别在不同场景下提供了高效的并发控制。深入理解它们的原理、用法以及适用场景,对于提高多线程应用的性能和可维护性至关重要。

正文

ReadWriteLockStampedLock 都是Java并发包(java.util.concurrent)中提供的用于支持读写操作的锁机制。它们分别在一些场景下提供了更高的并发性能和更灵活的功能。

ReadWriteLock(读写锁

  1. 基本原理:
  • ReadWriteLock 允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。这可以有效提高多线程环境下对共享资源的并发访问性能。

2.接口和实现:

  • ReadWriteLock 是一个接口,有两个主要的实现类:ReentrantReadWriteLockReadWriteLock

3.用法示例:

ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
Lock readLock = lock.readLock();
Lock writeLock = lock.writeLock();
 
// 读操作
readLock.lock();
try {
    // 读取共享资源的操作
} finally {
    readLock.unlock();
}
 
// 写操作
writeLock.lock();
try {
    // 写入共享资源的操作
} finally {
    writeLock.unlock();
}

StampedLock(印戳锁)

  1. 基本原理:
  • StampedLock 也支持读写锁的基本功能,但引入了“印戳”(stamp)的概念,用于标记锁的状态。不同于 ReadWriteLock 的是,StampedLock 提供了乐观读锁和悲观读锁两种读锁。

2.接口和实现:

  • StampedLock 是一个类,没有直接的接口。它提供了readLock()writeLock()等方法。

3.用法示例:

StampedLock lock = new StampedLock();
 
// 乐观读
long stamp = lock.tryOptimisticRead();
// 读取共享资源的操作
if (!lock.validate(stamp)) {
    // 如果乐观读失败,转换为悲观读
    stamp = lock.readLock();
    try {
        // 读取共享资源的操作
    } finally {
        lock.unlockRead(stamp);
    }
}
 
// 写操作
long writeStamp = lock.writeLock();
try {
    // 写入共享资源的操作
} finally {
    lock.unlockWrite(writeStamp);
}

区别与适用场景:

  • 性能差异:
  • StampedLock 的性能在某些场景下可能更好,特别是在读多写少的情况下。
  • 功能差异:
  • StampedLock 提供了乐观读锁,可以不阻塞地尝试读取资源,适用于对读操作要求较高的场景。
  • ReadWriteLock 更简单直观,适用于读写操作相对均衡的场景。
  • 适用场景:
  • 如果读操作频繁而写操作较少,且对读操作的并发性能要求较高,可以考虑使用 StampedLock
  • 如果读写操作相对均衡,或者更倾向于简单的实现,可以使用 ReadWriteLock

在选择使用 ReadWriteLock 还是 StampedLock 时,要根据具体的应用场景和性能需求来进行权衡。

结语

ReadWriteLockStampedLock 为我们在多线程环境中进行读写操作提供了强大的支持。ReadWriteLock适用于读写操作相对均衡的场景,而StampedLock则在读多写少的情况下可能更为高效。在实际应用中,根据具体的需求和性能优化目标,选择适合的锁机制是关键。通过深入研究和灵活运用这两种锁机制,希望你能够更加高效地处理多线程编程中的共享资源访问。


相关文章
|
1天前
|
安全 Java 开发者
Java中的读写锁ReentrantReadWriteLock详解,存在一个小缺陷
Java中的读写锁ReentrantReadWriteLock详解,存在一个小缺陷
10 2
|
7月前
|
存储 缓存 算法
JUC第四讲:Java中的锁
JUC第四讲:Java中的锁
Java 最常见的面试题:synchronized 和 ReentrantLock 区别是什么?
Java 最常见的面试题:synchronized 和 ReentrantLock 区别是什么?
java锁:第四章:读写锁
java锁:第四章:读写锁
java锁:第四章:读写锁
|
Java Android开发
深入浅出,从 ReentrantLock 到 AQS | Java(下)
对于非Java后端同学来说,没听过倒也不是什么太过分的事,但是如果你深入学习过 Java 并发相关,那么肯定会去了解各种锁,而作为一个 有志青年 的你必然会在心里来一句,为什么加了锁就可以同步 ? 此时必然也会看到 AQS 的影子。
123 0
|
安全 Java Android开发
深入浅出,从 ReentrantLock 到 AQS | Java(上)
对于非Java后端同学来说,没听过倒也不是什么太过分的事,但是如果你深入学习过 Java 并发相关,那么肯定会去了解各种锁,而作为一个 有志青年 的你必然会在心里来一句,为什么加了锁就可以同步 ? 此时必然也会看到 AQS 的影子。
102 0
|
Java
Java JUC ReentrantReadWriteLock解析
读写锁 ReentrantReadWriteLock 原理
134 0
Java JUC ReentrantReadWriteLock解析
|
Java
Java JUC ReentrantLock解析
独占锁 ReentrantLock 原理
75 0
Java JUC ReentrantLock解析
面试官:知道Java1.8中新加的StampedLock吗?
面试官:知道Java1.8中新加的StampedLock吗?
【小家java】JUC并发编程之Synchronized和Lock、ReadWriteLock、ReentantLock的使用以及原理剖析(上)
【小家java】JUC并发编程之Synchronized和Lock、ReadWriteLock、ReentantLock的使用以及原理剖析(上)
【小家java】JUC并发编程之Synchronized和Lock、ReadWriteLock、ReentantLock的使用以及原理剖析(上)