• Java项目源码学习笔记(一):IdentityCache


    import java.lang.ref.ReferenceQueue;
    import java.lang.ref.WeakReference;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Set;
    
    public class IdentityCache<K, V>{
    	
    	private final HashMap<K, Entry<K,V>> mWeakMap = new HashMap<K, Entry<K, V>>();
    	private ReferenceQueue<V> mQueue = new ReferenceQueue<V>();
    
    	public IdentityCache(){}
    
    	private static class Entry<K, V> extends WeakReference<V>{
    		K mKey;
    		public Entry(K key, V value, ReferenceQueue<V> queue){
    			super(value, queue);
    			mKey = key;
    		}
    	}
    
    	private void cleanUpWeakMap(){
    		Entry<K, V> entry = (Entry<K,V>)mQueue.poll();
    		while(entry != null){
    			mWeakMap.remove(entry.mKey);
    			entry = (Entry<K,V>)mQueue.poll();
    		}
    	}
    
    	public synchronized V put(K key, V value){
    		cleanUpWeakMap();
    		Entry<K, V> entry = mWeakMap.put(key, new Entry<K,V>(key, value, mQueue));
    		return entry == null ? null : entry.get();
    	}
    
    	public synchronized V get(K key){
    		cleanUpWeakMap();
    		Entry<K,V> entry = mWeakMap.get(key);
    		return entry == null ? null : entry.get();
    	}
    
    	public synchronized ArrayList<K> keys(){
    		Set<K> set = mWeakMap.keySet();
    		ArrayList<K> result = new ArrayList<K>(set);
    		return result;
    	}
    }
    

    简单分析一个类,我们看看它的变量和public方法,这二者基本决定了类的用途。

    很显然,这是一个自定义容器类。它提供了一个容器变量和对外的接口put, get。

    细节说明:

    1. Entry:继承自WeakReference,封装容器要盛装的V对象,因此这个自定义容器类包括WeakReference的功能优势。而我们知道WeakReference对象本质内容是它封装的对象,这里是V。所以IdentityCache容器的功能就是——一个HashMap容器,同时容器盛放的对象具有WeakReference的功效。

    2. synchronized:表明这是一个并发容器,普通的HashMap并不具备并发的功能。

  • 相关阅读:
    报错:ls: 无法访问/opt/app/spark/lib/sparkassembly*.jar: 没有那个文件或目录
    报错:Hadoop Warning: fs.defaultFS is not set when running "ls" command.
    Windows下python脚本开机自启动配置
    LZO安装和使用
    uline 单位使用实例
    lnmp 环境redis 修改配置文件,重启操作位置
    uniapp utext margin属性使用
    nodesass安装和使用
    es6新增语法之`${}`
    uniapp三元运算符
  • 原文地址:https://www.cnblogs.com/fordreamxin/p/5398012.html
Copyright © 2020-2023  润新知