Java并发编程实战~ReadWriteLock~

快速实现一个缓存

public class Cache<K,V> {final Map<K, V> m = new HashMap<>();final ReadWriteLock rwl = new ReentrantReadWriteLock();// 读锁final Lock r = rwl.readLock();// 写锁final Lock w = rwl.writeLock();// 读缓存public V get(K key) {r.lock();try { return m.get(key); }finally { r.unlock(); }}// 写缓存public V put(String key, Data v) {w.lock();try { return m.put(key, v); }finally { w.unlock(); }}
}

实现缓存的按需加载

public class Cache<K,V> {final Map<K, V> m = new HashMap<>();final ReadWriteLock rwl = new ReentrantReadWriteLock();final Lock r = rwl.readLock();final Lock w = rwl.writeLock();public V getWithLoad(K key) {V v = get(key);// 缓存中存在,返回if(v != null) {  return v;}  // 缓存中不存在,查询数据库w.lock();      try {// 再次验证,其他线程可能已经查询过数据库v = m.get(key); if(v == null){  // 查询数据库v= loadData(...);m.put(key, v);}} finally{w.unlock();}return v; }// 读缓存public V get(K key) {r.lock();try { return m.get(key); }finally { r.unlock(); }}}

读写锁的升级与降级

锁的升级--禁止

// 读缓存
r.lock();         
try {v = m.get(key); if (v == null) {w.lock();try {// 再次验证并更新缓存// 省略详细代码} finally{w.unlock();}}
} finally{r.unlock();     
}

锁的降级--支持

public class CachedData {Object data;volatile boolean cacheValid;final ReadWriteLock rwl = new ReentrantReadWriteLock();// 读锁  final Lock r = rwl.readLock();// 写锁final Lock w = rwl.writeLock();void processCachedData() {// 获取读锁r.lock();if (!cacheValid) {// 释放读锁,因为不允许读锁的升级r.unlock();// 获取写锁w.lock();try {// 再次检查状态  if (!cacheValid) {data = ...cacheValid = true;}// 释放写锁前,降级为读锁// 降级是可以的r.lock(); } finally {// 释放写锁w.unlock(); }}// 此处仍然持有读锁try {use(data);} finally {r.unlock();}}
}

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

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

相关文章

猎取人心的36条黄金法则

法则一&#xff1a;维护你的声誉&#xff0c;保持清白法则二&#xff1a;不会树敌的人&#xff0c;也不会拥有朋友法则三&#xff1a;小人物也绝对值得你去与之交往法则四&#xff1a;绝不可忽视外在形象……首因效应是很厉害的法则五&#xff1a;亲密有间&#xff0c;绝不可踏…

怎么导出链接_如何导出CocosCreator项目供cocos2dx加载

1、新建CocosCreator项目。2、安装creator_to_cocos2dx 插件拷贝到 Creator 项目的 packages 目录3、在cocoscreator项目中&#xff0c;项目(Project) -> LuaCPP Support -> Setup Target Project&#xff0c;出现的对话框中 Project Path 选择目标 Cocos2d-x 工程的路径…

C++对象模型

From&#xff1a;http://blog.csdn.net/wxc1987821/article/details/5958325 图说C对象模型&#xff1a;对象内存布局详解&#xff1a;http://blog.csdn.net/alexqiweek/article/details/52624641 1 前言 了解你所使用的编程语言究竟是如何实现的&#xff0c;对于C程序员可能…

Java并发编程实战~StampedLock

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

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

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

GridView正反双向排序

后台代码&#xff1a; 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…

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

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

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

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

自已动手制作寸照

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

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

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

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

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

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

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

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

arp病毒利用的Javascript技术

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

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

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

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

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

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

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

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

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

Java并发编程实战~CyclicBarrier

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