写点什么

HashMap + 软引用进行缓存

  • 2022 年 4 月 17 日
  • 本文字数:1626 字

    阅读完需:约 5 分钟

二、软引用(SoftReference)与弱引用(WeakReference)




软引用:如果一个对象只具有软引用,而当前虚拟机堆内存空间足够,那么垃圾回收器就不会回收它,反之就会回收这些软引用指向的对象。


弱引用:垃圾回收器一旦发现某块内存上只有弱引用(一定请注意只有弱引用,没强引用),不管当前内存空间是否足够,那么都会回收这块内存。


三、代码实例(强引用 VS 软引用)




现在的管理系统里,为了提升性能,往往会加入缓存,将部分常用的数据缓存到内存中,这样用于在访问时,会直接从内存中取出,降低数据库的访问量,加快用户获取数据的速度。将数据加入到 hashmap 中,如果内存空间足够,那么我们可以通过缓存来提升性能,但万一内存空间不够,我们可以依次释放一些内存,释放后不会影响业务流程,最多就是降低些性能。


对比一下,如果我们这里不用软应用,而是用强引用来缓存,由于不知道用户何时点击,我们还无法得知什么时候可以撤销这些对象上的强引用,或者即使我们引入了一套缓存淘汰流程,但这就是额外的工作了,这就没刚才使用“软引用“那样方便了。

1、软引用 hashmap 工具类

public class SoftHashMap<K, V> extends HashMap<K, V> {


/**


  • queue,软引用标记队列

  • <p>

  • ★★★★★★★ 解释 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》开源 ★★★★★★★

  • 当 SoftNode 中 Value 被回收时,SoftNode 对象会被放入 queue 中,以表示当前 SoftNode 中的 Value 不存在

  • 对我们 Java 开源项目【ali1024.coding.net/public/P7/Java/git】 的使用好处就是,我们读取 queue 队列,取出 SoftNode 对象,取出其内部的 Key

  • 以便于 temp 通过 key remove


*/


private ReferenceQueue<V> queue;


/**


  • 真正的 map 对象

  • 1、temp 内部 封装的 Node 强引用 K 和 SoftNode

  • 2、SoftNode 内部强引用 K,弱引用真正的 Value


*/


private HashMap<K, SoftNode<K, V>> temp;


public SoftHashMap() {


queue = new ReferenceQueue<>();


temp = new HashMap<>();


}


@Override


public V get(Object key) {


clearQueue();


// 通过 key 进行取值,如果为 null,返回 null,否则返回 SoftNode 软引用的值


SoftNode softNode = temp.get(key);


return softNode == null ? null : (V) softNode.get();


}


@Override


public V put(K key, V value) {


clearQueue();


// 创建 SoftNode 对象


SoftNode softNode = new SoftNode(key, value, queue);


// 返回 key 之前所对应的 SoftNode 对象,即 oldSoftNode


SoftNode oldSoftNode = temp.put(key, softNode);


// 如果 oldSoftNode 为 null,就返回 null,否则就返回 oldSoftNode 所软引用的 Value


return oldSoftNode == null ? null : (V) oldSoftNode.get();


}


@Override


public boolean containsKey(Object key) {


clearQueue();


return temp.containsKey(key);


}


@Override


public V remove(Object key) {


clearQueue();


SoftNode<K, V> remove = temp.remove(key);


return remove == null ? null : remove.get();


}

写在最后

作为一名即将求职的程序员,面对一个可能跟近些年非常不同的 2019 年,你的就业机会和风口会出现在哪里?在这种新环境下,工作应该选择大厂还是小公司?已有几年工作经验的老兵,又应该如何保持和提升自身竞争力,转被动为主动?


就目前大环境来看,跳槽成功的难度比往年高很多。一个明显的感受:今年的面试,无论一面还是二面,都很考验 Java 程序员的技术功底。


最近我整理了一份复习用的面试题及面试高频的考点题及技术点梳理成一份“Java 经典面试问题(含答案解析).pdf 和一份网上搜集的“Java 程序员面试笔试真题库.pdf”(实际上比预期多花了不少精力),包含分布式架构、高可扩展、高性能、高并发、Jvm 性能调优、Spring,MyBatis,Nginx 源码分析,Redis,ActiveMQ、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx 等多个知识点高级进阶干货!


由于篇幅有限,为了方便大家观看,这里以图片的形式给大家展示部分的目录和答案截图!


Java 经典面试问题(含答案解析)

阿里巴巴技术笔试心得


用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
HashMap + 软引用进行缓存_Java_爱好编程进阶_InfoQ写作平台