版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_16055765/article/details/79751195
package com.ming.thread;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class MingCache {
/**
* 用过缓存的map
*/
private Map<String,Object> cache=new HashMap<String,Object>();
/**
* 读写锁
*/
private ReadWriteLock lock=new ReentrantReadWriteLock();
/**
* 通过缓存获取数据 考虑多线程情况
* @author: chenhuaming
* @param key
* @return
* 2018年3月29日下午11:29:28
*/
public Object getData(String key){
lock.readLock().lock();//处理多线程读取安全问题
Object obj=null;
try {
obj = cache.get(key);
if(null==obj){
lock.readLock().unlock();
lock.writeLock().lock();//处理并情况
try {
if(null==obj){//处理并发写锁的情况产生的性能问题
obj="ming";//此处去查数据库
}
} catch (Exception e) {
e.printStackTrace();
}finally{
lock.writeLock().unlock();
}
lock.readLock().lock();
}
} catch (Exception e) {
e.printStackTrace();
}finally{
lock.readLock().unlock();
}
return obj;
}
}