java线程系列---读写锁ReentrantReadWriteLock

获取顺序

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

重入

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

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

锁定降级

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

监测

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

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

示例用法

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

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;
}
}



posted on 2012-06-26 15:48  c语言源码  阅读(193)  评论(0编辑  收藏  举报

导航