原创文章,转载请注明
把软引用和单例结合,实现一个简单的缓存。
软引用对于缓存的实现是非常适用的。软引用在内存存在压力的时候会强制进行卸载,销毁对象。
单例实现的方式有很多,目前最流行的方式是懒汉模式。
这里通过静态内部类实现懒汉模式。
我们知道类初始化之前需要加载,验证,准备,解析。
在准备阶段就已经会对静态方法区的内存进行分配了,只不过除了final修饰的静态成员变量之外的静态变量只会赋予默认值。实际的值需要在初始化阶段才会赋予。
知道了这一点,就知道为什么要通过静态内部类来实现了,在外部类被加载的时候,如果没有用到内部类,内部类是没有被加载的。这个时候就不会为它在静态方法区分配内存。
现在看一下简单的实现方式吧
public class AuthCache { PRivate static class CacheSingleton{ private static SoftReference<Map<String,String>> softReferenceCache=new SoftReference(new HashMap<String,String>()); private static AuthCache instance=new AuthCache(); } public static AuthCache instance(){ //缓存被垃圾回收器回收 if(CacheSingleton.softReferenceCache.get()==null) CacheSingleton.softReferenceCache=new SoftReference(new HashMap<String,String>()); return CacheSingleton.instance; } public static boolean isExists(String key){ return CacheSingleton.softReferenceCache.get().containsKey(key); } public static boolean isSame(String key,String value){ if(isExists(key)){ String v=CacheSingleton.softReferenceCache.get().get(key); return value.equals(v); }else{ return false; } } public static boolean add(String key,String value){ CacheSingleton.softReferenceCache.get().put(key, value); return true; } public static void remove(String key){ if(isExists(key)){ CacheSingleton.softReferenceCache.get().remove(key); } } }
新闻热点
疑难解答