java并发编程-读写锁
最近项目中需要用到读写锁
读写锁适用于读操作多,写操作少的场景,假设你的程序中涉及到对一些共享资源的读和写操作,且写操作没有读操作那么频繁。在没有写操作的时候,两个线程同时读一个资源没有任何问题,所以应该允许多个线程能在同时读取共享资源。但是如果有一个线程想去写这些共享资源,就不应该再有其它线程对该资源进行读或写,也就是说 读-读能共存,读-写不能共存,写-写不能共存
我们直接使用java的读写锁 ReadWriteLock
如下代码是使用缓存的典型场景:
public class ReadWriteLockTest {
private static ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private static LoadingCache<Long, LinkModel> windowCache = CacheBuilder
.newBuilder()
.expireAfterWrite(Config.ALL_RELOAD_CYCLE+,TimeUnit.HOURS) //写入ALL_RELOAD_CYCLE小时后remove掉
.build(new CacheLoader<Long, LinkModel>() {
@Override
public LinkModel load(Long key) throws Exception {
return LinkModelDAO.getLinkModelWindow(key);
}
});
public static LinkModel getLinkModelWindow(long linkId) {
try {
readWriteLock.readLock().lock();
LinkModel model = windowCache.get(linkId);
return model;
} catch (ExecutionException e) {
LOGGER.error(e.getMessage(), e);
}finally {
readWriteLock.readLock().unlock();
}
return null;
}
public static void refershModelWindowCache(String partitionId){
try {
readWriteLock.writeLock().lock();
HashMap<Long, LinkModel> linkModelHashMap = LinkModelDAO.getLinkModelWindowsByPartition(partitionId,Config.ALL_ROADCLASS_LIST);
if(MapUtils.isNotEmpty(linkModelHashMap)){
windowCache.cleanUp();
windowCache.putAll(linkModelHashMap);
}
} catch (EventMiningException e) {
LOGGER.error(e.getMessage(), e);
}finally {
readWriteLock.writeLock().unlock();
}
}
}
下面这篇文章写得比较详细:
http://ifeve.com/read-write-locks/
java并发编程-读写锁的更多相关文章
- JAVA 并发编程-读写锁之模拟缓存系统(十一)
在多线程中,为了提高效率有些共享资源同意同一时候进行多个读的操作,但仅仅同意一个写的操作,比方一个文件,仅仅要其内容不变能够让多个线程同一时候读,不必做排他的锁定,排他的锁定仅仅有在写的时候须要,以保 ...
- java并发:读写锁ReadWriteLock
在没有写操作的时候,两个线程同时读一个资源没有任何问题,允许多个线程同时读取共享资源. 但是如果有一个线程想去写这些共享资源,就不应该再有其它线程对该资源进行读或写. 简单来说,多个线程同时操作同一资 ...
- java并发编程-StampedLock高性能读写锁
目录 一.读写锁 二.悲观读锁 三.乐观读 欢迎关注我的博客,更多精品知识合集 一.读写锁 在我的<java并发编程>上一篇文章中为大家介绍了<ReentrantLock读写锁> ...
- 读《Java并发编程的艺术》(一)
离开博客园很久了,自从找到工作,到现在基本没有再写过博客了.在大学培养起来的写博客的习惯在慢慢的消失殆尽,感觉汗颜.所以现在要开始重新培养起这个习惯,定期写博客不仅是对自己学习知识的一种沉淀,更是在督 ...
- 读Java并发编程实践中,向已有线程安全类添加功能--客户端加锁实现示例
在Java并发编程实践中4.4中提到向客户端加锁的方法.此为验证示例,写的不好,但可以看出结果来. package com.blackbread.test; import java.util.Arra ...
- 那些年读过的书《Java并发编程实战》和《Java并发编程的艺术》三、任务执行框架—Executor框架小结
<Java并发编程实战>和<Java并发编程的艺术> Executor框架小结 1.在线程中如何执行任务 (1)任务执行目标: 在正常负载情况下,服务器应用 ...
- 读《Java并发编程的艺术》学习笔记(一)
接下来一个系列,是关于<Java并发编程的艺术>这本书的读书笔记以及相关知识点,主要是为了方便日后多次复习和防止忘记.废话不多说,直接步入主题: 第1章 并发编程的挑战 并发编程的目的是 ...
- 【Java并发编程实战】-----“J.U.C”:ReentrantReadWriteLock
ReentrantLock实现了标准的互斥操作,也就是说在某一时刻只有有一个线程持有锁.ReentrantLock采用这种独占的保守锁直接,在一定程度上减低了吞吐量.在这种情况下任何的"读/ ...
- JAVA并发编程J.U.C学习总结
前言 学习了一段时间J.U.C,打算做个小结,个人感觉总结还是非常重要,要不然总感觉知识点零零散散的. 有错误也欢迎指正,大家共同进步: 另外,转载请注明链接,写篇文章不容易啊,http://www. ...
随机推荐
- Qt开发环境中使用报表控件FastReport遇到的一些问题(一)
FastReport是一款优秀的报表控件,由俄罗斯开发,国内有代理商.Qt环境下可实现报表功能的还有一款叫NCReport,也是收费控件,比较来比较去还是觉得前者功能强点.网上讲解此控件在Qt中使用的 ...
- PL/SQL工具连接ORALCE数据库的方法
http://www.cnblogs.com/dongzhiquan/archive/2011/11/21/2257629.html 1.利用ORACLE NET MANAGER工具 1)打开 ORA ...
- HC蓝牙模块测试AT指令搭建外部电路遇到的问题
按这个搭,AT指令烧不进去,两块板两次都不行. 这是我的底板(比较混乱的万能版) 第一次短路了,VCC和GND在板子下面连起来了,肉眼当然看不见,吹下来重新焊就好了. 第二次,txdrxd与usb转T ...
- pyhton 27 pip命令无法使用 没有Scripts文件夹 的解决方法
1 安装了setuptools http://jingyan.baidu.com/article/fb48e8be52f3166e622e1400.html 2 用ez_setup.py安装了setu ...
- Tuple方法
组元是C# 4.0引入的一个新特性,编写的时候需要基于.NET Framework 4.0或者更高版本.组元使用泛型来简化一个类的定义. public class Point { public int ...
- Codeforces Round #158 (Div. 2)
A. Adding Digits 枚举. B. Ancient Prophesy 字符串处理. C. Balls and Boxes 枚举起始位置\(i\),显然\(a_i \le a_j, 1 \l ...
- 去除Visual Studio引号中的内容和注释中出现的波浪下划线
[描述] 使用vs2013,注释或者字符串常量中,经常会出现红色的波浪线,非常烦人. 注意,不是代码错误的那种波浪线,我觉得代码错误智能提示的波浪线还是有必要留着的,这样可以避免过多的编译来发现错误, ...
- pt-ioprofile分析查看mysql的真实IO情况
针对IO密集型应用做系统调优的时候,我们通常都需要知道系统cpu 内存 io 网络等系统性能 和 使用率,结合应用本身的访问量,以及 mysql的性能指标来综合分析.比如说:我们将系统压力情况分为 ...
- dk.internal.org.objectweb.asm.Opcodes.IF_ACMPNE
http://cr.openjdk.java.net/~hannesw/8008351/webrev/src/jdk/nashorn/internal/codegen/Condition.java.s ...
- VB6的函数指针传递
Option Explicit Private Declare Function CallWindowProc Lib "user32" Alias "CallWindo ...