JDK8新增锁StampedLock详解

2023-11-17

1、StampedLock是做什么的?
-----》它是ReentrantReadWriteLock 的增强版,是为了解决ReentrantReadWriteLock的一些不足。
2、ReentrantReadWriteLock有什么不足之处呢?
------》我们都知道,ReentrantReadWriteLock是读写锁,在多线程环境下,大多数情况是读的情况远远大于写的操作,因此可能导致写的饥饿问题。(换人话来说的话,读操作一直都能抢占到CPU时间片,而写操作一直抢不了)
3、为什么会导致写操作会出血饥饿问题呢?
-----》 ReentrantReadWriteLock 写锁 的互斥的
(读和读---不互斥, 读和写---互斥,写和写----互斥),懂了吗?
4、正因为ReentrantReadWriteLock出现了 读和写是互斥的情况,这个地方需要优化,因此就出现了StampedLock!
5、StampedLock是读锁并不会阻塞写锁。这里就有朋友会问,如果这样设计的话,那么怎样保证读和写的一致性呢?
-----》StampedLock的设计思路也比较简单,就是在读的时候发现有写操作,再去读多一次。(思想上来说)
6、那下一个问题就是StampedLock是怎样知道读的时候发生了写操作呢?
-----》我们的StampedLock有两种锁,一种是悲观锁,另外一种是乐观锁。如果线程拿到乐观锁就读和写不互斥,如果拿到悲观锁就读和写互斥。
7、看StampedLock源码的时候,可以看writeLock()和trywriteLock(), tryOptimisticRead()这是本API中最有亮点的方法(乐观锁)。
==============================================================
public class Demo {
private int balance;
private StampedLock lock = new StampedLock();
public void conditionReadWrite (int value) {
// 首先判断balance的值是否符合更新的条件
long stamp = lock.readLock();
while (balance > 0) {
long writeStamp = lock.tryConvertToWriteLock(stamp);
if(writeStamp != 0) { // 成功转换成为写锁
stamp = writeStamp;
balance += value;
break;
} else {
// 没有转换成写锁,这里需要首先释放读锁,然后再拿到写锁
lock.unlockRead(stamp);
// 获取写锁
stamp = lock.writeLock();
}
  }
lock.unlock(stamp);
}
public void optimisticRead() {
long stamp = lock.tryOptimisticRead();
int c = balance;
// 这里可能会出现了写操作,因此要进行判断
if(!lock.validate(stamp)) {
// 要从新读取
long readStamp = lock.readLock();
c = balance;
stamp = readStamp;
}
/// 
lock.unlockRead(stamp);
}
public void read () {
long stamp = lock.readLock();
lock.tryOptimisticRead();
int c = balance;
// ...
lock.unlockRead(stamp);
}
public void write(int value) {
long stamp = lock.writeLock();
balance += value;
lock.unlockWrite(stamp);
}
}
====================================================
StampedLock的性能是远远好过ReentrantReadWriteLock的。那为什么还存在ReentrantReadWriteLock呢?
------》根据我们上述的代码,我们知道使用StampedLock,编写代码上相对繁琐些。ReentranReadWriteLock比较简单些。
悲观锁:每次拿数据的时候就去锁上。
乐观锁:每次去拿数据的时候,都没锁上,而是判断标记位是否有被修改,如果有修改就再去读一次。
(就像很多个人去桌子上看今天老师布置的作业题,另外桌子旁边有一个牌子,红色面代表“作业题已经被修改过了”,白色面代表“题目是最新的”。第一个人去看作业题,再看了下牌子,牌子是白色的,作业题是最新的。但是有一个人去看作业题,看完之后,再看隔壁的牌子,牌子变成红色了,于是他赶紧回去看了一下题目,果然题目已经被改过了,于是他再看了一次,再确认一次牌子颜色,都没问题之后,就放心走了。)



http://blog.sina.com.cn/s/blog_6f5e71b30102xfsb.html



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JDK8新增锁StampedLock详解 的相关文章

  • Erlang 进程和消息传递架构

    我手头的任务是读取大文件的行 处理它们 并返回有序结果 我的算法是 从评估工作负载的主进程开始 写在文件的第一行 生成工作进程 每个工作进程将使用 pread 3 读取文件的一部分 处理这部分 并将结果发送给 master master接收
  • DatagramSocket.send 线程安全吗?

    我打算使用一个实例DatagramSocket并称其为send http docs oracle com javase 7 docs api java net DatagramSocket html send 28java net Data
  • 如何围绕未正确发布的值演示竞争条件?

    我正在阅读 Java 并发实践 并查看第 51 页的示例代码 根据该书 这段代码如果没有正确发布 就有失败的风险 因为我喜欢编写示例代码并分解它们以证明它们是如何工作的 我尝试让它抛出 AssertionError 但失败了 引导我走向我的
  • Python urllib2.urlopen() 很慢,需要更好的方法来读取多个 url

    正如标题所示 我正在开发一个用 python 编写的网站 它多次调用 urllib2 模块来读取网站 然后我用 BeautifulSoup 解析它们 由于我必须阅读 5 10 个网站 因此页面需要一段时间才能加载 我只是想知道是否有办法一次
  • java中的volatile变量可以定义为static吗?

    我可以声明这样的事情吗 static volatile boolean first false 扩展迈克尔的评论 static只是意味着不与包含类的实例关联 volatile只是意味着该值可能会被其他线程更改而不会发出警告 因此 您的问题归
  • C++20 内存模型中释放序列定义的更改有何影响?

    考虑这个程序 Initially std atomic
  • 创建的线程数超出预期

    你可以找到该程序here https pastebin com H5fq732a 我正在消息传递框架 0MQ 中构建一个程序 我尝试执行我发布的内容here https stackoverflow com questions 4409620
  • IE9在IE7模式下有多少并发连接

    有谁知道 IE 9 在其他浏览器模式下允许多少个并发连接 既然我问的是 所有IE浏览器和其他顶级浏览器的并发连接数是多少 实际上在 Chrome 中存在问题 我认为这是一个并发问题 有人建议它也应该在 IE 中发生 但我没有安装 IE7 我
  • 官方 OpenCL 2.2 标准是否支持 WaveFront?

    众所周知 AMD OpenCL 支持 WaveFront 2015 年 8 月 http amd dev wpengine netdna cdn com wordpress media 2013 12 AMD OpenCL Programm
  • Erlang 如何并发处理访问邮箱

    关于如何使用erlang邮箱的信息有很多 但很少找到一篇论文或文档描述erlang如何在VM内部同时实际访问邮箱 据我了解 Erlang VM 必须执行锁定或 CAS 操作以确保消息完整性 erlang幕后有没有什么精巧的方法 我假设您所说
  • 我怎样才能残酷无情地中止 Java 中的任务?

    我用 Java 编写了一个数独求解器作为作业 目前我正在尝试找出它可能面临的有问题的输入 以使其变得更好 我已经生成了几千个数独网格David Bau 的数独生成器 http davidbau com archives 2006 09 04
  • 如何在刷新期间锁定哈希图?

    我有一个静电HashMap它在应用程序启动时填充 并每天刷新 如何确保刷新期间没有其他线程可以访问地图 ThreadSafe public class MyService private static final Map
  • Thread.yield()之后线程的Thread.State是什么?

    是什么Thread State之后的一个线程Thread yield 是不是一个Thread State WAITING 谢谢 不 线程仍会在RUNNABLE http download oracle com docs cd E17409
  • 并发 log4j

    我有自己的日志引擎 它将日志写入带有阻塞队列的单独线程上 为了使用 标准软件 我正在考虑切换到 log4j 我不希望我的高并发软件因日志命令而变慢 这些日志命令在调用命令时将所有内容写入磁盘 log4j 可以用作垃圾箱吗 Log4j 是大多
  • Java并发中的AbstractQueuedSynchronizer

    What is AbstractQueuedSynchronizer在Java中concurrent locks包用来做什么 有人可以阐明它的方法吗doAcquireInterruptibly and parkAndCheckInterru
  • 使用 Nginx 或 Apache 来提供动态内容? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 无锁算法中的 ABA

    我明白了ABA http en wikipedia org wiki ABA problem问题 但我无法理解的是 他们说在语言中自动垃圾收集它可能不会展示 所以我的问题是 自动垃圾收集如何防止ABA问题的发生 在java中是否可能 如果可
  • 非法监控状态异常

    如何将轮询线程传递给另一个线程进行处理 程序执行在控制器类中 该类具有 main 方法和线程池 主类控制器 public static void main String args throws InterruptedException Ru
  • Intel 64 和 IA-32 上的 MESI 有何意义

    MESI 的要点是保留共享内存系统的概念 然而 对于存储缓冲区 事情就变得复杂了 一旦数据到达 MESI 实现的缓存 下游内存就会保持一致 然而 在此之前 每个核心可能对内存位置 X 中的内容存在分歧 具体取决于每个核心的本地存储缓冲区中的
  • 独占锁定ConcurrentHashMap

    我知道不可能锁定 ConcurrentHashMap 进行独占访问 但是 我找不到原因 是因为构成CHM的 Segment 没有被api公开吗 据推测 如果是的话 客户端代码可以执行 交接 锁定 Cheers 我知道不可能锁定 Concur

随机推荐

  • linux tcpdump抓包命令详解,tcpdump(抓包分析命令详解)

    TCPDump可以完全拦截网络上传输的数据包以提供分析 它支持对网络层 协议 主机 网络或端口的过滤 并提供逻辑语句 例如和 或不帮助您删除无用的信息 tcpdump抓包分析命令详解 tcpdump是一个用于截取网络分组 并输出分组内容的东
  • 如何成为一个牛逼的脚本小子日记之0x001-JAVA 代码审计 Top half (2023829-...

    如何成为一个牛逼的脚本小子日记之 0x001 JAVA 代码审计 Top half 2023 8 29 2023 9 1 此记录是在拥有一定的java基础下进行的 java基础类 反射 继承 filter servlet calssLoad
  • Springboot实现热部署

    所谓的热部署 比如项目的热部署 就是在应用程序在不停止的情况下 实现新的部署 而Springboot在我们每次修改完代码之后 可能只是修改下打印的信息 就得重新启动App类 这样太浪费时间 有没有一种修改完代码让程序自动重启的方法呢 答案是
  • DirectShow中的工具GraphEdit使用小结

    一 安装完Windows SDK 7 0或7 1后 在C Program Files Microsoft SDKs Windows v7 0 Bin下有32位的graphedt exe 及x64目录下有64位版本的graphedt exe
  • Python—PEP8规范

    Python PEP8规范 介绍 代码布局 模块导入顺序 空格 注释 注释块 命名风格 应避免的名字 模块名 类名 异常名 全局变量名 函数名 方法名和实例变量名 设计建议 Python思维导图 app siweidaotu com R06
  • MySql如何获取表头字段?实用技巧

    show columns from 表名
  • Tomcat源码分析之getParameter(String)与getQueryString()

    本文有些地方的描述对某些人来说可能比较罗嗦 如果想直接进入正题 可阅读 源码分析 节 但本文是自己一步步分析解决问题思路的记录 虽然有些地方的思考还不是很深入 主要是由于时间不是很充裕 虽然花了三天时间 但感觉还是不够 我会在后续的博文中
  • OpenZeppelin集成Truffle编写健壮安全的合约

    原文 http truffleframework com tutorials robust smart contracts with openzeppelin 因为智能合约往往涉及金钱 保证Soldity代码没有错误 以及足够的安全是非常根
  • RTP/RTCP/RTSP负载H264的一些问题小结

    以下内容都是基于rfc3984 RTP负载H264时的参数配置 1 在TCP传输时 Transport头中的interleaved参数必须设置 比如0 1 或者2 3 海康的流中出现了4 但是没有配置 所以wireshark也无法解析cha
  • Maven实战(五)使用maven开发的项目,如何更方便地提取第三方包

    如果你的项目使用maven构建的话 当项目要上线 部署到服务器上去的时候或许会碰见这样的问题 问题就是 服务器上没有maven的环境 也就是说 项目所依赖到的那些仓库 repository 中的jar包你需要单独提取出来上传到服务器中去 解
  • 软件测试题答案

    搜索答案的一个方法 点Ctrl F 在页面上查找 输入题目上的部分字 软件测试题及答案 1 单选题 通常 是在编码阶段进行的测试 它是整个测试工作的基础 A 系统测试 B 确认测试 C 集成测试 D 单元测试 正确答案 D 2 单选题 如果
  • 华三ap设置无线服务器,H3C无线控制器V5版本配置AP上线的方法

    H3C无线控制器上没有开启自动上线 需要先手动在控制器上输入AP信息 然后新建vlan 新建vlan接口 新建wlan ess接口 新建无线服务 然后在AP上配置射频参数 交换机上需要开启DHCP 为手机终端分配IP地址 并且交换机上与AP
  • vscode相关问题处理

    1 跳转缓慢 跳转函数 一直转圈圈 比较慢 关闭vscode 删除索引文件 cd config Code User workspaceStorage rm rf 2 重新打开vscode即可 2 波浪线报错 在确认c cpp propert
  • RocketMQ-高级原理

    本节讲解下当MQ消息消费失败 或者发送不成功时如何处理消息 消息发送不成功一般存在于几种情况 网络原因 服务宕机 或者broker配置 消息发送失败 如果是由于broker配置原因 可以通过报错提示排查原因 无法查到路由信息 一般考虑到ro
  • MATLAB算法实战应用案例精讲-【时序模型】循环神经网络-GRU(附MATLAB和Python代码)

    目录 前言 几个高频面试题 1 GRU与LSTM的区别与联系 2 LSTM和RNN的区别 GRU的引入 算法原理
  • 浅析TVSPK稳压二极管,谁能更胜一筹?

    1 符号封装 稳压二极管和TVS管的电路符号和稳压二极管基本相同 封装也差不多 有时候在外观甚至很难分别出来到底哪个是哪个 2 电路接法 稳压二极管和TVS管在电路都是反向接入 也就是利用它的反向特性 利用PN结雪崩效应 在反向击穿前均有一
  • Python3爬虫学习——requests库笔记

    Python3爬虫学习 requests库笔记 前言 本笔记用于记录整理requests库的一些基本知识 内容会根据博主自己的认知作增添或压缩 其实自己看了下之前写的urllib库笔记 觉得那么写万字长文并不妥当 没有起到快速查阅的笔记作用
  • Nginx下载大文件失败

    原因分析 nginx代理nginx时 前端用户请求下载文件 nginx代理会先从后端nginx拿到文件并缓存到本地 然后响应给客户端 其中与proxy buffer相关的配置项如下 proxy buffer size 512k proxy
  • Socket_Tcp加密文件传输系统

    代码下载链接 Socket Tcp 原文链接 https blog csdn net weixin 45746588 article details 107683901 这是一个课程的作业 我是初学者 所以写完这个代码还是花了我好几周的时间
  • JDK8新增锁StampedLock详解

    1 StampedLock是做什么的 它是ReentrantReadWriteLock 的增强版 是为了解决ReentrantReadWriteLock的一些不足 2 ReentrantReadWriteLock有什么不足之处呢 我们都知道