缓存系统的理解:
间于用户和数据库中间的一个环节,我们知道用户直接访问数据库的时间是远大于直接访问内存,所以有了缓存区后用户访问数据时 这样,用户先访问缓存区当缓存区有用户需要的数据时直接拿走,当缓存区没有这样的数据,访问数据库并把访问所得的数据放在缓存区,这样当下一个需要这个数据的用户就直接访问内存即可得到。(ps:来自importNEW博客《一道面试题比较synchronized和读写锁》,作者:where)
核心代码实现:
/**
* Title: 一个简单的I/O读写锁
* 一般我们对数据的操作无非两种:“读”和“写”。
* 那么在大量数据的读写操作的时候平凡的操作数据库的效率就会变得很慢,
* 相对于在缓存中读取数据是非常的慢,那么我们可以使用读写锁来设计一个缓存系统,来提升我们对大量数据读写的效率。
* 需要注意的一个问题:
* 关于unlock操作,我们知道只要是上了锁就必须要解锁,但是有这么一种情况就是当你上完锁后在执行解锁操作前程序出现异常,
* 那这个所可能就一直存在。所以针对这个问题我们一般将unlock操作放在finally代码块中,就可以保证上了的锁一定会被解。
* 这里我们还能仔细的思考下,synchronized和I/O读写锁的区别。
* Description: TestDemo
* @author: xg.chen
* @date:2016年8月2日
*/
public class Lock {
/**
* MethodsTitle: 通过读写锁来获取数据
* Description: TestDemo
* @author: xg.chen
* @date:2016年8月2日
*/
public static Object getData(String key){
//将数据数据库取出来的数据放在map中
Map<String, String> map=new HashMap<String, String>();
String id="001";
String name="zhangsna";
map.put(id, name);
//设置读写锁过程
ReadWriteLock rw = new ReentrantReadWriteLock();
rw.readLock().lock();//在读前先上读锁
Object result = null;
try{
result = map.get(key);
if(result==null){//如果内存中没有所要数据,这里的if比较关键,它避免了多余的几次对数据库的读取
rw.readLock().unlock();
rw.writeLock().lock();
if(result==null){
try{
//用这个代替对数据库访问得到数据的步骤
result = "缓存中数据是空的,这里我们可以取数据获取自己想要的数据!";
}finally{
rw.writeLock().unlock();
}
rw.readLock().lock();
}
}
}finally{
rw.readLock().unlock();
}
return result;
}
//测试模块
public static void main(String[] args) {
String id="002";
Object o=getData(id);
System.out.println(o);
}
}