Java ~ Lock ~ ReadWriteLock【总结】

3 篇文章 0 订阅

前言


 相关系列

 涉及内容

一 概述


 简介

    ReadWriteLock(读写锁)接口在API层面定义了读写锁的概念。读写锁是在独占锁的基础上衍生/细化出来的概念,其主张将执行读/写操作的线程进行区别对待。由于单纯的读操作并发并不会导致共享数据出现线程安全问题,因此读写锁允许读线程在无写线程时随意共享/并发访问共享数据以提升程序性能,而只在写线程访问时独占共享数据以保证线程安全。读写锁内部维护了一对关联的读/写锁,分别交由执行读/写操作的线程持有。读锁是共享特性的锁,已持有读锁的读线程并不会妨碍其它读线程试图持有读锁及访问共享数据。而写锁则是独占特性的锁,已持有写锁的写线程会独占访问共享数据并阻止其它所有读/写线程对读/写的持有,从而满足读写锁“读读并发/读写互斥/写写互斥”的概念设计。

    读写锁仅在多核处理器中提升性能。读写锁相对于独占锁的优势在于其解放了读操作的并发性能,而由于单核处理器的并发本质是串行分片执行,因此读写锁在单核处理器中相比独占锁并不能取得良好的性能提升。

    读写锁的性能提升效果会受到多方因素的影响。即使是在多核处理器下读写锁的性能提升效果也受到多方因素的影响,这主要取决于读/写操作在执行频率/时长两个方面的占比。在执行频率方面,我们很容易就能推测出读写锁可以在读操作频率占比越高的场景带来更大性能提升,因此这意味着读线程可以在大部分时间里并发访问共享数据。而在执行时长方面读操作的时长越短则越有利于读写锁的性能提升,因为这意味着读写锁在相同时间内可以比独占锁支持更多数量的读操作执行。除此以外读写锁的性能提升效果还受到线程竞争的影响,因为读/写线程对读/写锁的竞争必然也会对性能产生一定的负面效果。总之,读写锁是否适用于我们希望使用的场景最终还是要通过资料收集和数据统计来确定。

    尽管读写锁接口定义的基础操作相当直截了当,但开发者在设计读写锁接口的实现类时依然有一些需要注意的点,它可能会影响读写锁在程序中的有效性。这些点包含但不限于:

  • 更偏向于令读/写线程中的哪个持有读/写锁?偏向读线程可能导致写线程无限延迟;而偏向写线程可能导致性能提升不明显。
  • 在读操作执行频率/时长较高/长时如何处理写线程的长时间无法持有写锁的情况?
  • 是否令读/写线程公平的获取读/写锁?
  • 读/写锁能否重入?
  • 线程能否同时获得读/写锁?
  • 写锁能否降级为读锁?本质是独占锁能否降级为共享锁。
  • 读锁能否升级为写锁?本质是共享锁能否升级为独占锁。

二 方法


  • Lock readLock() —— 读锁 —— 获取当前读写锁的读锁。
  • Lock writeLock() —— 写锁 —— 获取当前读写锁的写锁。
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

说淑人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值