📜  Java中ReadWriteLock接口和ReentrantReadWriteLock类的区别

📅  最后修改于: 2022-05-13 01:55:18.599000             🧑  作者: Mango

Java中ReadWriteLock接口和ReentrantReadWriteLock类的区别

ReadWriteLock是Java中的一个接口。 ReadWriteLock 允许我们向数据结构添加线程安全功能,同时通过允许多个线程同时读取数据和一个线程独占更新数据来提高吞吐量。

ReadWriteLock 在Java.util.concurrent.locks 包中进行了描述,其中 ReentrantReadWriteLock 是一个实现类。 ReadWriteLock 实现确保 writeLock 操作的内存同步效果(如 Lock 接口中所述)相对于关联的 readLock 也成立。所以,我们可以像这样创建一个 ReadWriteLock:

ReadWriteLock rwlock = new ReentrantReadWriteLock();

有保证的一对锁与 ReadWriteLocks 相关联:

  • 只读锁和
  • 写锁

只要没有写者,读锁可能被多个读线程同时持有。并且写锁是独占的。

Java中的 ReentrantReadWriteLock 类

ReentrantReadWriteLocks 可用于在某些集合的某些用途中增强并发性。 ReentrantReadWriteLock 类是一个有用的类,只有集合被认为是主要的,由更多的读取线程访问而不是写入线程,并且需要的操作开销超过同步开销。

ReentrantReadWriteLock 类具有以下属性:

  • 获取顺序:作为读取器或写入器,此类不会对锁访问施加优先顺序。虽然,正在支持可选的公平策略。
  • Reentrancy:在 ReentrantLock 的风格中,读者和作者都可以重新获得读锁或写锁。
  • 锁降级:可重入还可以从写锁降级为读锁,通过实现写锁,然后读锁,然后释放写锁。
  • 锁获取中断:在锁获取过程中,读锁和写锁都支持中断。
  • 条件支持: 关于写锁,写锁提供了以相同方式运行的 Condition 实现。
  • Instrumentation: ReentrantReadWriteLock 类支持确定锁是持有还是竞争的方法。

ReentrantReadWriteLock 在Java.util.concurrent.locks 包中有描述,实现的接口有 Serializable、ReadWriteLocks。我们可以像这样创建一个 ReentrantReadWriteLock:

ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();

ReentrantReadWriteLock 有两个独立的锁:

  • 方法readLock()返回的读锁“ r”
  • 方法writeLock()返回的写锁“ w”
Lock r = rwl.readLock();
Lock w = rwl.writeLock();

ReadWriteLock 和 ReentrantReadWriteLock 的区别

S. No.ReadWriteLockReentrantReadWriteLock
1.ReadWriteLock is an interface.ReentrantReadWriteLock is a class.
2.ReadWriteLock implements ReentrantReadWriteLock class.ReentrantReadWriteLock implements ReadWriteLock interface, supporting similar semantics to ReentrantLock.
3.The ReadWriteLock interface defines locks similarly, that may be shared among readers but are exclusive to writers.Here, a single implementation, ReentrantReadWriteLock, is provided, since it covers most standard usage contexts. 
4.It is designed as a high-level locking mechanism that allows you to append thread-safety features to a data structure.Programmers may develop by their own implementations to cover nonstandard requirements.