- import java.util.HashMap;
- import java.util.Map;
- import java.util.concurrent.locks.ReadWriteLock;
- import java.util.concurrent.locks.ReentrantReadWriteLock;
- public classCacheDemo {
- private Map<String,Object> cache= newHashMap<String, Object>(); //模拟缓存,每个key对应一个obj
- public static void main(String[] args) {
- }
- private ReadWriteLock rwl = newReentrantReadWriteLock();//定义读写锁
- //我们先跟去key去缓存中取数据,如果有的话,则返回对应的值,如果没有,去数据库中查找,返回查找到的值
- public Object getData(String key){
- rwl.readLock().lock();//上读锁
- Objectvalue = null;
- try {
- value= cache.get(key);
- if(value == null){//如果换从中没有的话 打开读锁
- rwl.readLock().unlock();
- rwl.writeLock();//读与写是互斥的,所以要先解开读锁,才能进行写操作(个人理解)
- try {
- value= “aaaa”;//实际是去数据库中queryDB();
- cache.put(key, value);//将得到的数据,存入缓存中。以后的线程直接在缓存中取值(张老师视频上没有,个人加的)
- }catch(Exception e) {
- }finally{
- rwl.writeLock().unlock();//释放读锁
- }
- rwl.readLock().lock();//还原读锁,防止下面的finally出现异常
- }
- }catch(Exception e) {
- }
- finally{
- rwl.readLock().unlock();
- }
- return value;
- }
- }
- 实现注意事项:此锁最多支持 65535 个递归写入锁和 65535 个读取锁。试图超出这些限制将导致锁方法抛出 .JDK_API_1_6_zh_CN.CHM::/java/lang/Error.html]Error。读写锁:多个读锁不互斥,读锁与写锁互斥,写锁与写锁互斥
复制代码 |