JDK1.8 StampedLock: 解决ReentrantReadWriteLock在读多写少情况下,写线程饥饿问题

ReentrantReadWriteLock 在沒有任何读写锁时,才可以取得写入锁,这可用于实现了悲观读取(Pessimistic Reading),

即如果执行中进行读取时,经常可能有另一执行要写入的需求,为了保持同步,ReentrantReadWriteLock 的读取锁定就可派上用场。

然而,如果读取执行情况很多,写入很少的情况下,使用 ReentrantReadWriteLock 可能会使写入线程遭遇饥饿(Starvation)问题,

也就是写入线程吃吃无法竞争到锁定而一直处于等待状态。

StampedLock控制锁有三种模式(写,读,乐观读),一个StampedLock状态是由版本和模式两个部分组成,锁获取方法返回一个数字作为票据stamp,

它用相应的锁状态表示并控制访问,数字0表示没有写锁被授权访问。在读锁上分为悲观锁和乐观锁。

所谓的乐观读模式,也就是若读的操作很多,写的操作很少的情况下,你可以乐观地认为,写入与读取同时发生几率很少,因此不悲观地使用完全的读取锁定,

程序可以查看读取资料之后,是否遭到写入执行的变更,再采取后续的措施(重新读取变更信息,或者抛出异常) ,这一个小小改进,可大幅度提高程序的吞吐量!!

synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定;
ReentrantLock、ReentrantReadWriteLock,、StampedLock都是对象层面的锁定,要保证锁定一定会被释放,就必须将unLock()放到finally{}中;
StampedLock 对吞吐量有巨大的改进,特别是在读线程越来越多的场景下;
当只有少量竞争者的时候,synchronized是一个很好的通用的锁实现;
当线程增长能够预估,ReentrantLock是一个很好的通用的锁实现;

Original: https://www.cnblogs.com/yuyutianxia/p/9046240.html
Author: 等风来。。
Title: JDK1.8 StampedLock: 解决ReentrantReadWriteLock在读多写少情况下,写线程饥饿问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/540074/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 黑群晖 Active Backup for Business 套件激活方法(群晖备份远程samba)

    通过 Synology Active Backup for Business 软件,IT 人员可以在单一界面上集中管理分散在 PC、服务器、虚拟机中的数据,并可在灾难发生时,在服务…

    Java 2023年6月6日
    0207
  • for what

    what for ? posted @2022-08-15 12:40 yub4by 阅读(24 ) 评论() 编辑 Original: https://www.cnblogs.c…

    Java 2023年6月5日
    050
  • 下面代码输出结果有何不同?

    #include using namespace std; void test1() { int a,x; for(a=0,x=0;a1&&!x++;a++) a+…

    Java 2023年6月7日
    078
  • CentOS 6快捷安装RabbitMQ教程

    1.安装Erlang yum install erlang 2.安装RabbitMQ yum install rabbitmq-server 3.配置开机自启动 chkconfig…

    Java 2023年5月29日
    073
  • IO(字符流的使用操作)

    OutputStreamWriter(使用)—写数据–(一次写入一个字符) OutputStreamWriter(OutputStream out):根据默…

    Java 2023年6月5日
    079
  • Java并发相关知识点梳理和研究

    知识点思维导图 (图比较大,可以右键在新窗口打开) 经典的wait()/notify()/notifyAll()实现生产者/消费者编程范式深入分析 & synchroniz…

    Java 2023年5月29日
    077
  • 一致性hash原理 看这一篇就够了

    ​ 在了解一致性哈希算法之前,最好先了解一下缓存中的一个应用场景,了解了这个应用场景之后,再来理解一致性哈希算法,就容易多了,也更能体现出一致性哈希算法的优点,那么,我们先来描述一…

    Java 2023年6月7日
    080
  • Java中serialVersionUID是干嘛的?

    serialVersionUID是在反序列化时校验版本的,如果传过来的字节流中的serialVersionUID和本地定义的版本号不一致,则不支持序列化,并抛出InvalidCas…

    Java 2023年5月29日
    053
  • Map<String, String>转String后,转回Map

    public static Map<string,string> mapStringToMap(String str){ str=str.substring(1, st…

    Java 2023年6月5日
    069
  • 使用7z程序CLI实现基础功能

    阅文时长 | 0.64分钟字数统计 | 1025.6字符主要内容 | 1、引言&背景 2、压缩 3、解压 4、更多命令可见 5、声明与参考资料『使用7z程序CLI实现基础功…

    Java 2023年6月5日
    074
  • abp MicroserviceDemo swagger添加 OAuth

    abp官方示例中的 abp-samples,swagger并没有提供 OAuth,这个在我们平时的开发过程中并不太友好,这里记录下在添加 swagger OAuth遇到的一些问题,…

    Java 2023年6月8日
    0124
  • Netty源码分析之ChannelPipeline(二)—ChannelHandler的添加与删除

    上篇文章中,我们对Netty中ChannelPipeline的构造与初始化进行了分析与总结,本篇文章我们将对ChannelHandler的添加与删除操作进行具体的的代码分析; 一、…

    Java 2023年6月9日
    090
  • 分布式锁及其实现

    对于Java中的锁大家肯定都很熟悉,在Java中synchronized关键字和ReentrantLock可重入锁在我们的代码中是经常见的,一般我们用其在多线程环境中控制对资源的并…

    Java 2023年6月8日
    090
  • SpringCloudAlibaba 微服务讲解(四)Sentinel–服务容错(二)

    4.7 Sentinel 规则 4.7.1 流控规则 流量控制,其原理是监控应用流量的QPS(每秒查询率)或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的榴莲高…

    Java 2023年6月7日
    080
  • 并发编程之:深入解析线程池

    大家好,我是小黑,一个在互联网苟且偷生的农民工。 本期带来线程池的第二期内容,如果对线程池的基本概念还不是很清楚,可以先看我上一篇文章。 面试官:谈谈你对线程池的理解 本期内容会从…

    Java 2023年6月7日
    083
  • 集合

    Collection(接口) 单列”集合” List(接口) (列表) 有序可重复 ArrayList 数组 LinkList 链表 Set (接口) 无序…

    Java 2023年6月8日
    071
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球