读写锁的相关知识学习

举报
多米诺的古牌 发表于 2021/08/26 22:49:03 2021/08/26
【摘要】 1.读写锁1.1 读写锁的介绍ReadWriteLock是JUC中的一个接口,他的实现类是ReentrantReadWriteLock;读写锁是在锁的基础上更加明确化的去控制,明确标识是读锁,还是写锁。读写锁允许多个线程同时读共享变量,但是只允许一个线程写共享变量,当写共享变量的时候也会阻塞读的操作,这样在读的时候就不会互斥,提高读的效率。主要的原则是读的时候可以被多个线程同时读,写的时候只...

1.读写锁

1.1 读写锁的介绍

ReadWriteLock是JUC中的一个接口,他的实现类是ReentrantReadWriteLock;

读写锁是在锁的基础上更加明确化的去控制,明确标识是读锁,还是写锁。

读写锁允许多个线程同时读共享变量,但是只允许一个线程写共享变量,当写共享变量的时候也会阻塞读的操作,这样在读的时候就不会互斥,提高读的效率。

主要的原则是读的时候可以被多个线程同时读,写的时候只能有一个线程去写。

在JUC中ReadWriteLock读写锁,是怎么实现上面这种描述的呢?

1.2 读写锁的使用

使用JUC中的ReadWriteLock读写锁的时候,基本和使用Lock锁类似,通过加锁,try、catch、finally中加业务代码,解锁的方式达到线程同步的效果;

具体方法是:

1.2.1 通过对象.writeLock().lock()实现写入时加锁,即在写入的方法中,通过writeLock()方法标识写锁,然后通过lock()方法加锁,确保在写入完成之前没有其他线程加入这个写入操作;

         通过对象.readLock().lock()实现读取时加锁,即在读取的方法中,通过readLock()方法标识读锁,然后通过lock()方法加锁,在读方法中加锁是为了方式读取的时候有线程进行写入操作;

1.2.2 再在try、catch、finally中加业务代码;

1.2.3 通过对象.writeLock().unlock()实现写入方法的解锁,即在写入的方法结束后,通过writeLock()方法标识写锁,然后通过unlock()方法解锁;

         通过对象.readLock().unlock()实现写入方法的解锁,即在读取的方法结束后,通过readLock()方法标识读锁,然后通过unlock()方法解锁;

1.3 读写锁遵循的原则

1.3.1 写锁,也可以称为独占锁,在写入操作的时候,一次只能被一个线程所占用;

1.3.2 读锁,也可以称为共享锁,在读取操作的时候,可以同时被多个线程锁占有使用;

1.3.3 综上所述,读取的时候可以允许多个线程一起读取;写入的时候只能允许一个线程写入;写入的时候不允许有线程进行读取操作,并且读取的时候也不允许有线程进行写入操作。

ReadWriteLock lock = new ReentrantReadWriteLock();
//写锁
    void write(){
        lock.writeLock().lock();
        try {
            System.out.println("相关业务");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.writeLock().lock();
        }
    }
//读锁
void read(){
    lock.readLock().lock();
    try {
        System.out.println("相关业务");
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        lock.readLock().lock();
    }
}

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。