Java并发编程实战~StampedLock

悲观读/写锁示例

final StampedLock sl = new StampedLock();// 获取 / 释放悲观读锁示意代码
long stamp = sl.readLock();
try {// 省略业务相关代码
} finally {sl.unlockRead(stamp);
}// 获取 / 释放写锁示意代码
long stamp = sl.writeLock();
try {// 省略业务相关代码
} finally {sl.unlockWrite(stamp);
}

乐观读失效,升级为悲观读

public class Point {private int x, y;final StampedLock sl = new StampedLock();// 计算到原点的距离  int distanceFromOrigin() {// 乐观读long stamp = sl.tryOptimisticRead();// 读入局部变量,// 读的过程数据可能被修改int curX = x, curY = y;// 判断执行读操作期间,// 是否存在写操作,如果存在,// 则 sl.validate 返回 falseif (!sl.validate(stamp)){// 升级为悲观读锁stamp = sl.readLock();try {curX = x;curY = y;} finally {// 释放悲观读锁sl.unlockRead(stamp);}}return Math.sqrt(curX * curX + curY * curY);}
}

有一点需要特别注意,那就是:如果线程阻塞在 StampedLock 的 readLock() 或者 writeLock() 上时,此时调用该阻塞线程的 interrupt() 方法,会导致 CPU 飙升。例如下面的代码中,线程 T1 获取写锁之后将自己阻塞,线程 T2 尝试获取悲观读锁,也会阻塞;如果此时调用线程 T2 的 interrupt() 方法来中断线程 T2 的话,你会发现线程 T2 所在 CPU 会飙升到 100%。

final StampedLock lock= new StampedLock();
Thread T1 = new Thread(()->{// 获取写锁lock.writeLock();// 永远阻塞在此处,不释放写锁LockSupport.park();
});
T1.start();
// 保证 T1 获取写锁
Thread.sleep(100);Thread T2 = new Thread(()->// 阻塞在悲观读锁lock.readLock()
);
T2.start();
// 保证 T2 阻塞在读锁
Thread.sleep(100);
// 中断线程 T2
// 会导致线程 T2 所在 CPU 飙升
T2.interrupt();
T2.join();

StampedLock 读模板:

final StampedLock sl = new StampedLock();// 乐观读
long stamp = sl.tryOptimisticRead();
// 读入方法局部变量
......
// 校验 stamp
if (!sl.validate(stamp)){// 升级为悲观读锁stamp = sl.readLock();try {// 读入方法局部变量.....} finally {// 释放悲观读锁sl.unlockRead(stamp);}
}
// 使用方法局部变量执行业务操作
......

StampedLock 写模板:

long stamp = sl.writeLock();
try {// 写共享变量......
} finally {sl.unlockWrite(stamp);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++学习之路 | PTA乙级—— 1078 字符串压缩与解压 (20 分)(精简)

1078 字符串压缩与解压 (20 分) 文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示。例如 ccccc 就用 5c 来表示。如果字符没有重复,就原样输出。例如 aba 压缩…

GridView正反双向排序

后台代码: using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using S…

北斗产业发展现状与前景预测研究

来源:北斗时空作者:曹冲北斗产业,泛指中国卫星导航产业,2012年底我国北斗系统投入区域服务以后,中国的卫星导航产业就以北斗为轴心主线加以推动发展,从此称其为北斗产业。顺理成章由其延续我国整个导航定位…

python注册系统_Python制作简易注册登录系统

Python制作简易注册登录系统这篇文章主要为大家详细介绍了 Python 简易注册登录系统的制作方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下Python 是一种面向对象、解释型计算机程序设计语言,由 Guido van Rossum 于 1989 年底发明&am…

自已动手制作寸照

毕业在即,学校动不动就给张单子,说,添了他,贴照片别忘。苦于我对镜头不感冒,照出来的相片很难看,真的没有本人好看。而且在照证明相的时候都不会笑了,脸很僵硬,不像平时的照片那么活…

Java并发编程实战~CountDownLatch

无线程池实现 while(存在未对账订单){// 查询未对账订单Thread T1 new Thread(()->{pos getPOrders();});T1.start();// 查询派送单Thread T2 new Thread(()->{dos getDOrders();});T2.start();// 等待 T1、T2 结束T1.join();T2.join();// 执行对账操作diff check(…

C++学习之路 | PTA乙级—— 1082 射击比赛 (20 分)(精简)

1082 射击比赛 (20 分) 本题目给出的射击比赛的规则非常简单,谁打的弹洞距离靶心最近,谁就是冠军;谁差得最远,谁就是菜鸟。本题给出一系列弹洞的平面坐标(x,y),请你编写程序找出冠军和菜鸟。我们假设靶心在原点(0,0)。…

linuxoracle查看用户权限_权限管理系统设计过程

今天和大家一起探讨权限管理方面的设计心得。权限管理,是B端后台系统一个重要的组成部分,属于底层的支撑功能,系统内所有的功能,甚至字段的增减都涉及到权限的分配和管理。因此怎样配置后台的权限系统,以适应多变业务需…

MIT:大脑如何跟踪运动中的物体?

来源:脑健康联盟抓住一个弹起的球,或者用球拍击球,这两种行动都需要合理地估算触球时间。一直以来,神经科学家都相信,大脑是通过计算物体的运动速度来完成这些动作的。然而,麻省理工学院的一项新研究表明&a…

《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记

来源:http://dsqiu.iteye.com/blog/1669614 之前一直对C内部的原理的完全空白,然后找到《Inside The C Object Model》这本书看了下, 感觉收获很大,因为书写得比较早,有些知识应该要更新,但是还是值得好好研…

arp病毒利用的Javascript技术

本文的目的是探讨JS相关技术,并不是以杀毒为主要目的,杀毒只是为讲解一些JS做铺垫的,呵呵,文章有点长,倒杯咖啡或者清茶慢慢看,学习切勿急躁! 最近公司的网络中了这两天闹的很欢的ARP病毒&#…

C++学习之路 | PTA乙级—— 1083 是否存在相等的差 (20 分)(精简)

1083 是否存在相等的差 (20 分) 给定 N 张卡片,正面分别写上 1、2、……、N,然后全部翻面,洗牌,在背面分别写上 1、2、……、N。将每张牌的正反两面数字相减(大减小),得到 N 个非负差值&#xf…

C++的黑科技(深入探索C++对象模型)

来源:http://www.cnblogs.com/qiaozhoulin/p/5227673.html “如何产生一个不能被继承的类”,这道题我反反复复只想到,将父类的构造函数私有,让子类不能调用,最后归结出一个单例模式,但面试官说,…

物联网测试完整解决方案 | 为你的芯片、模块、终端保驾护航

来源:物联网智库2017年被视为物联网商用元年。窄带物联网标准正式冻结,国内运营商重点布局以及设备制造商的强力推动……自此,物联网规模化商用迈入了快车道。然而,与传统的智能手机类似,基于NB-IoT技术的物联网设备在…

mbp网速很慢_苹果笔记本上网很慢怎么回事?macbook无线上网慢的解决方法

Mac笔记本连接到WiFi之后,发现网速很慢,简直让人无法接受,打开一个页面都要等上好几分钟。苹果笔记本上网很慢的原因有很多,检查一下WiFi信号是满格,那么排除所在网络带宽限制的原因。想要解决此问题也简单,只要修改手…

Java并发编程实战~CyclicBarrier

用 CyclicBarrier 实现线程同步 线程 T1 和 T2 要做到步调一致,都完成后通知到线程 T3 创建了一个计数器初始值为 2 的 CyclicBarrier,你需要注意的是创建 CyclicBarrier 的时候,我们还传入了一个回调函数,当计数器减到 0 的时候…

梦中的婚礼

让女孩听了陶醉的曲子梦中的婚礼 :http://player.youku.com/player.php/sid/XMjA1ODc3MTI/v.swf 电脑键盘弹奏 梦中的婚礼 :http://player.youku.com/player.php/sid/XMzMzNzQyMDA/v.swf 转载于:https://www.cnblogs.com/cube/archive/2008/07/19/1246736.html

C++学习之路 | PTA乙级—— 1084 外观数列 (20 分)(精简)

1084 外观数列 (20 分) 外观数列是指具有以下特点的整数序列: d, d1, d111, d113, d11231, d112213111, … 它从不等于 1 的数字 d 开始,序列的第 n1 项是对第 n 项的描述。比如第 2 项表示第 1 项有 1 个 d,所以就是 d1;第 2 项是…

DeepMind提出图形的「深度生成式模型」,可实现「任意」图形的生成

原文来源:arXiv作者:Yujia Li、Oriol Vinyals、Chris Dyer、Razvan Pascanu、Peter Battaglia 「雷克世界」编译:嗯~阿童木呀、KABUDA一般来说,图形是基本的数据结构,它在诸如知识图、物理和社会交互、语言和化学等许多…

eviews曲线图怎么做_【干货速递】Eviews:你不可不知的经典问答!

更多精彩内容请关注211统计课堂计量经济学是分析啥的?01计量经济学的主要用途或目的主要有两个方面:1.理论检验。这是计量经济学用途最为主要的和可靠的方面。这也是计量经济学本身的一个主要内容。2.预测应用。从理论研究和方法的最终目的看&#xff0c…