今天在看struts2源码时看到了一个类LoggerFactory里使用了ReentrantReadWriteLock,于是网上查了下资料,总结学习如下。
ReentrantReadWriteLock会使用两把锁来解决问题,一个读锁,一个写锁
代码如下:
public class ReadWriteLockTest {
//创建一个读写锁
private static final ReadWriteLock lock = new ReentrantReadWriteLock();
//需要加读写锁的对象
private static Map<String, Object> map ;//缓存数据
//修改数据
public static void addMapData(Map<String, Object> map){
lock.writeLock().lock();//加上写锁,不允许其他线程读和写
try{
ReadWriteLockTest.map = map;
}finally{
lock.writeLock().unlock(); //释放写锁
}
}
public static Map<String,Object> getMapData(){
lock.readLock().lock();//加上读锁,其他线程只能读不能写
try{
if(map!=null){
return map;
}
}finally{
lock.readLock().unlock();
}
//没数据的时候就加写锁
lock.writeLock().lock();
try{
if(map==null){
map = new HashMap<String, Object>();
//此处可以换成读取数据放入缓存
map.put("lvxc", "lvxc1");
}
return map;
}finally{
lock.writeLock().unlock();
}
}
}
大致的了解就是如此,还有关于一些 重入,锁降级的不太明白,就不做记录了。先做如上记录,后续再补充