博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java线程系列---读写锁ReentrantReadWriteLock
阅读量:5135 次
发布时间:2019-06-13

本文共 1290 字,大约阅读时间需要 4 分钟。

获取顺序

此类不会将读取者优先或写入者优先强加给锁定访问的排序。但是,它确实支持可选的公平 策略。当公平地构造线程时,线程利用一个近似到达顺序的策略来争夺进入。当释放写入锁定后,将写入锁定分配给等待时间最长的单个写入者,如果有一个等待时间比所有写入者更长的读取者,则将读取锁定分配给读取者 set。当非公平地构造线程时,则不需要按照到达顺序进入锁定。不管是哪一种情况,如果读取者处于活动状态,而某个写入者进入锁定状态,那么在获取写入者并释放写入锁定之前,不会将读取锁定授予任何后续的读取者。

重入

此锁定允许读取者和写入者按照 的样式重新获取读取锁定或写入锁定。在写入线程保持的所有写入锁定都已经释放后,才允许写入者使用它们。

此外,写入者可以获取读取锁定——但反过来则不成立。在其他应用程序中,当在调用或回调那些在读取锁定状态下执行读取操作的方法期间保持写入锁定时,重入很有用。如果读取者试图获取写入锁定,那么将永远不会获得成功。

锁定降级

重入还允许从写入锁定降级为读取锁定,其实现方式是:先获取写入锁定,然后获取读取锁定,最后释放写入锁定。但是,从读取锁定升级到写入锁定是不可能的

监测

此类支持一些确定是保持锁定还是争用锁定的方法。这些方法设计用于监视系统状态,而不是同步控制。

此类行为的序列化方式与内置锁定的相同:反序列化的锁定处于解除锁定状态,无论序列化该锁定时其状态如何。

示例用法

下面的代码展示了一个简单的缓存系统的模拟

public class CacheDemo {

private Map<String, Object> cache = new HashMap<String, Object>();
public static void main(String[] args) {
// TODO Auto-generated method stub
}
private ReadWriteLock rwl = new ReentrantReadWriteLock();
public  Object getData(String key){
rwl.readLock().lock();   //添加读锁
Object value = null;
try{
value = cache.get(key);
if(value == null){
rwl.readLock().unlock();  //释放读锁
rwl.writeLock().lock();     //添加写锁
try{
if(value==null){
value = "aaaa";//去查数据库queryDB();
}
}finally{
rwl.writeLock().unlock();
}
rwl.readLock().lock();
}
}finally{
rwl.readLock().unlock();
}
return value;
}
}

转载于:https://www.cnblogs.com/javaTest/archive/2012/06/26/2589091.html

你可能感兴趣的文章
[USACO 2017 Feb Gold] Tutorial
查看>>
关于mysql中GROUP_CONCAT函数的使用
查看>>
OD使用教程20 - 调试篇20
查看>>
Java虚拟机(JVM)默认字符集详解
查看>>
Java Servlet 过滤器与 springmvc 拦截器的区别?
查看>>
(tmp >> 8) & 0xff;
查看>>
linux命令之ifconfig详细解释
查看>>
NAT地址转换
查看>>
Nhibernate 过长的字符串报错 dehydration property
查看>>
Deque - leetcode 【双端队列】
查看>>
gulp插件gulp-ruby-sass和livereload插件
查看>>
免费的大数据学习资料,这一份就足够
查看>>
clientWidth、clientHeight、offsetWidth、offsetHeight以及scrollWidth、scrollHeight
查看>>
企业级应用与互联网应用的区别
查看>>
itext jsp页面打印
查看>>
Perl正则表达式匹配
查看>>
DB Change
查看>>
nginx --rhel6.5
查看>>
Eclipse Python插件 PyDev
查看>>
selenium+python3模拟键盘实现粘贴、复制
查看>>