java中基于CAS的新的同步机制(四)ReadWriteLock

本文探讨了Java中的ReadWriteLock,它是ReentrantLock的增强版,支持读写分离以提高多线程环境下读取数据的效率。通过代码示例展示了ReadWriteLock在多个线程同时读取数据时的并发性能优势,与ReentrantLock的串行读取形成对比。
摘要由CSDN通过智能技术生成

前言

阅读这篇文章,需要对读锁和写锁有一定的了解。

共享锁(S锁)又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S 锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

排他锁(X锁)又称写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。


本篇文章来介绍ReadWriteLock,是之前介绍过的ReentrantLock的增强版,同样也是基于CAS的新的同步机制。

之所以说ReadWriteLock是ReentrantLock的升级版,是因为它不仅具有了ReentrantLock的特性,还具备了ReadWriteLock的特性。这点,从它的初始化语句就能看出来:

ReadWriteLock lock = new ReentrantReadWriteLock();

具备了ReentrantLock的特性,是指这个锁也能像ReentrantLock一样,达到保证多线程安全可靠的目的。

具备了ReadWriteLock的特性,是指这个锁可以根据不同的情况,来使用共享锁或者排它锁,从而提高程序运行效率。

下面我们通过代码来演示ReadWriteLock与ReentrantLock之间的区别。

代码演示:与ReentrantLock的区别

代码演示前,先说一下与ReentrantLock之间的不同之处。

ReentrantLock的运行机制是,当一个线程得到了锁之后,其他线程如果想得到这个锁,必须等这个线程释放了锁才行。

但是如果几个线程只是去读取数据而不是修改数据的话,其实完全可以让它们共同读到这些数据的,而不是等一个线程释放锁,其他线程再去争锁。

ReadWriteLock就是解决了这个问题,当某段代码并不修改数据,只是读取数据的话,直接用读锁。这样其他线程如果想读取这个数据,同样可以获得这把读锁,从而提高了效率。

下面是ReadWriteLock实现的读写方法和ReentrantLock实现的读写方法

// 初始化ReadWriteLock
static ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
static Lock readLock = readWriteLock.readLock();
static Lock writeLock = readWriteLock.writeLock();
    
// ReadWriteLock的读写方法
static void readMethod() {
   
    try {
   
        readLock.lock();
        Thread.sleep(1000); // 模拟读操作花费的时间
        System.out.println("read over"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值