基于软引用的单例缓存

              原创文章,转载请注明

              把软引用和单例结合,实现一个简单的缓存。

      1、软引用

              软引用对于缓存的实现是非常适用的。软引用在内存存在压力的时候会强制进行卸载,销毁对象。

      2、单例

              单例实现的方式有很多,目前最流行的方式是懒汉模式。

              这里通过静态内部类实现懒汉模式。

         2.1、类加载准备阶段

              我们知道类初始化之前需要加载,验证,准备,解析。

              在准备阶段就已经会对静态方法区的内存进行分配了,只不过除了final修饰的静态成员变量之外的静态变量只会赋予默认值。实际的值需要在初始化阶段才会赋予。

              知道了这一点,就知道为什么要通过静态内部类来实现了,在外部类被加载的时候,如果没有用到内部类,内部类是没有被加载的。这个时候就不会为它在静态方法区分配内存。

      3、实现代码

               现在看一下简单的实现方式吧

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);
		}
	}
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值