Java SoftReference类案例详解

软引用简介

软引用是用来表示某个引用会被GC(垃圾处理器)收集的类。
当有引用指向某个obj的时候,通常发生GC的时候不会把这个对象处理掉,但是被软引用包装的对象,当应用内存将要被耗尽的时候-->即将发生OOM,垃圾处理器就会把它带走。这么看来,软应用的生命周期还是很长的,可以用来做缓存处理。

我们可以通过以下方式来创建一个软引用:

SoftReference<String> ref = new SoftReference<String>("Hello world");

接收数据:

String value = ref.get();

if (value == null) {
  // 如果被GC回收了 在这里重新初始化
}
// 你的逻辑
...

软引用用作缓存

创建一个SoftReferenceCache,内部留个HashMap来保存内容。

public class SoftReferenceCache<K, V> {

  private final HashMap<K, SoftReference<V>> mCache;

  public SoftReferenceCache() {
    mCache = new HashMap<K, SoftReference<V>>();
  }
}

再创建个往里面塞数据的方法。我们在put方法中创建了一个软引用,value类型就是你在生成SoftReferenceCache时候创建的。

public void put(K key, V value) {
  mCache.put(key, new SoftReference<V>(value));
}

当然,还需要个get方法。

public V get(K key) {
  V value = null;

  SoftReference<V> reference = mCache.get(key);

  if (reference != null) {
    value = reference.get();
  }

  return value;
}

这个方法会判断所要get的内容的状态,在使用get方法的时候,还需要判断返回是否为空,一方面可能本身就没缓存这个对象,另一方面可能他被回收了。

示例

SoftReferenceCache<Integer, Person> mPersonCache = new SoftReferenceCache<Integer, Person>();

mPersonCache.put(0, new Person("Peter");
mPersonCache.put(1, new Person("Jan");
mPersonCahce.put(2, new Person("Kees");

// 去拿Jan
Person p = (Person) mPersonCache.get(1);

完整代码

import java.lang.ref.SoftReference;
import java.util.HashMap;

/**
 * SoftRefenceCache
 * @param <K> key的类型.
 * @param <V> value的类型.
 */
public class SoftReferenceCache<K, V> {
  private final HashMap<K, SoftReference<V>> mCache;

  public SoftReferenceCache() {
    mCache = new HashMap<K, SoftReference<V>>();
  }

  /**
   * 将对象放进缓存中,这个对象可以在GC发生时被回收
   *
   * @param key key的值.
   * @param value value的值型.
   */

  public void put(K key, V value) {
    mCache.put(key, new SoftReference<V>(value));
  }

  /**
   * 从缓存中获取value
   *
   * @param key
   *
   * @return 如果找到的话返回value,如果被回收或者压根儿没有就返* 回null
   */

  public V get(K key) {
    V value = null;

    SoftReference<V> reference = mCache.get(key);

    if (reference != null) {
      value = reference.get();
    }

    return value;
  }
}

看国外大神blog有感并做修改。

到此这篇关于Java SoftReference类案例详解的文章就介绍到这了,更多相关Java SoftReference类内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 解决@Cacheable在同一个类中方法调用不起作用的问题

    @Cacheable在同一类中方法调用无效 上述图片中,同一个类中genLiveBullets()方法调用同类中的queryLiveByRoom()方法,这样即便标识了Cacheable标签,再次调用时也没有走缓存. cacheable不支持内部方法调用的方式,需要修改为把请求缓存的改成service方式,Aservice中的genLiveBullets()调用Bservice中的queryLiveByRoom() 见下图,已测试再次调用时为走的缓存. @Cacheable的使用总结 @Cach

  • java中Memcached的使用实例(包括与Spring整合)

    一.什么是Memcached? Memcached是danga.com开发的分布式内存对象缓存系统,所谓分布式,意味着它不是本地的,而是基于网络连接完成服务.Memcached把一些数据通过key=value数据存储到内存中,这样访问更加方便快捷. 但是随之而来的问题是如果Memcached关闭或者Memcached的服务器关闭那么所保存的内容也就没有了. 二.安装Memcached服务端 我是在Win下做的实验. 首先下载Win下的Memcached,解压到指定目录. memcached.ex

  • 解析springboot整合谷歌开源缓存框架Guava Cache原理

    目录 Guava Cache:⾕歌开源缓存框架 Guava Cache使用 使用压测⼯具Jmeter5.x进行接口压力测试: 压测⼯具本地快速安装Jmeter5.x 新增聚合报告:线程组->添加->监听器->聚合报告(Aggregate Report) Guava Cache:⾕歌开源缓存框架 Guava Cache是在内存中缓存数据,相比较于数据库或redis存储,访问内存中的数据会更加高效.Guava官网介绍,下面的这几种情况可以考虑使用Guava Cache: 愿意消耗一些内存空间

  • PHP之深入学习Yii2缓存Cache组件详细讲解

    什么是缓存组件Cache 缓存是提升 Web 应用性能简便有效的方式. 通过将相对静态的数据存储到缓存并在收到请求时取回缓存, 应用程序便节省了每次重新生成这些数据所需的时间. 定义缓存组件 Yii2的缓存是通过组件Component实现的,在项目的配置文件中,配置components->cache实现对缓存组件的定义. 项目配置文件的路径为config/web.php. 页面缓存PageCache 作为网站来讲,Yii2的页面缓存非常便捷地将已经渲染完全的网页结果保存起来,并在一个缓存周期内不

  • Java reservedcodecachesize虚拟机参数案例详解

    一.reservedcodecachesize参数介绍 该参数是JvM虚拟机调优中调整内存大小的一个设置参数,值得大小设置直接影响到Code Cache的大小,而jvm编译的代码有常常存放在Code Cache中,而Code Cache的空间内存又支撑着jvm的正常运行,如果该空间不足jvm虚拟机将会发生问题,并且性能持续降低. Code Cache就是所谓的代码缓存,由于JVM虚拟机的内存默认是有大小限制的,因此代码缓存区域肯定也是有一定大小限制,一般的Windows电脑上64位系统下它的默认

  • Android基于SoftReference缓存图片的方法

    本文实例讲述了Android基于SoftReference缓存图片的方法.分享给大家供大家参考,具体如下: Java中的SoftReference即对象的软引用.如果一个对象具有软引用,内存空间足够,垃圾回收器就不会回收它:如果内存空间不足了,就会回收这些对象的内存.只要垃圾回收器没有回收它,该对象就可以被程序使用.软引用可用来实现内存敏感的高速缓存.使用软引用能防止内存泄露,增强程序的健壮性. SoftReference的特点是它的一个实例保存对一个Java对象的软引用,该软引用的存在不妨碍垃

  • PHP解决高并发问题(opcache)

    php高并发之opcache 今天工作的时候接触到客户的一台服务器,业务逻辑比较简单 .估算pv在120w左右吧,用的是阿里云2c4g的服务器.一大早就开始卡顿了,登陆服务器后查看负载到了八九十. 之后就想办法调整一下吧.突然想起某位前辈说过的:开启opcache吧,真的会变快的. 于是我马上就开始整,过程很简单 1.进入php,ini 搜索opcache . 2,修改对应参数(如下) zend_extension=opcache.so #引入扩展 php7中默认已经装好了 可能是鼓励大家用吧

  • Java jvm中Code Cache案例详解

    Code Cache JVM生成的native code存放的内存空间称之为Code Cache:JIT编译.JNI等都会编译代码到native code,其中JIT生成的native code占用了Code Cache的绝大部分空间 相关参数 Codecache Size Options -XX:InitialCodeCacheSize 用于设置初始CodeCache大小 -XX:ReservedCodeCacheSize 用于设置Reserved code cache的最大大小,通常默认是2

  • Java SoftReference类案例详解

    软引用简介 软引用是用来表示某个引用会被GC(垃圾处理器)收集的类. 当有引用指向某个obj的时候,通常发生GC的时候不会把这个对象处理掉,但是被软引用包装的对象,当应用内存将要被耗尽的时候-->即将发生OOM,垃圾处理器就会把它带走.这么看来,软应用的生命周期还是很长的,可以用来做缓存处理. 我们可以通过以下方式来创建一个软引用: SoftReference<String> ref = new SoftReference<String>("Hello world&

  • Java Condition类案例详解

    一 condition 介绍及demo Condition是在java 1.5中才出现的,它用来替代传统的Object的wait().notify()实现线程间的协作,相比使用Object的wait().notify(),使用Condition的await().signal()这种方式实现线程间协作更加安全和高效.因此通常来说比较推荐使用Condition,阻塞队列实际上是使用了Condition来模拟线程间协作. Condition是个接口,基本的方法就是await()和signal()方法:

  • java BigDecimal类案例详解

    目录 前言 一.介绍 二.知识点介绍 三.知识点详解 1.概述 2.BigDecimal构造方法 3.源码的描述 4.BigDecimal加减乘除运算 5.总结 6.精炼练习 6.1  题目 6.2 实验步骤 结语 前言 只要认真计划一件事,并且一边坚持一边调整,往往会完成得十分出色.懈怠的情绪谁都会有,不要担心自己比别人走得慢,也不要因暂时的挫折心灰意冷,只要不断调整心态,不停下脚步,最终能抵达终点. 一.介绍 float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制

  • Java基础之枚举Enum类案例详解

    一.文章序言 Java中引用类型:数组.类.接口.枚举.注解 枚举这个既熟悉又陌生的东西具体再哪里可以使用呢? 什么是枚举? 枚举是一个引用类型,枚举就是一个规定了取值范围的变量类型. 枚举变量不能使用其他的数据,只能使用枚举中常量赋值.提高程序安全性: //格式: public enum 枚举名{ //枚举的取值范围 //枚举中可以生命方法 } 枚举的使用场景介绍? 1.最常见的情况如星期,相关变量我们会在Java里面重复使用,在这里我们就可以来定义一个叫做"星期"的枚举. publ

  • Java反射 PropertyDescriptor类案例详解

    JAVA中反射机制(JavaBean的内省与BeanUtils库) 内省(Introspector) 是Java 语言对JavaBean类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则.如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为"值对象"(Value Object),或"VO".方法比较少.这些信息储存在类的私有变量中,通过set(

  • Java ConcurrentHashMap用法案例详解

    一.概念 哈希算法(hash algorithm):是一种将任意内容的输入转换成相同长度输出的加密方式,其输出被称为哈希值. 哈希表(hash table):根据设定的哈希函数H(key)和处理冲突方法将一组关键字映象到一个有限的地址区间上,并以关键字在地址区间中的象作为记录在表中的存储位置,这种表称为哈希表或散列,所得存储位置称为哈希地址或散列地址. 二.HashMap与HashTable 1,线程不安全的HashMap 因为多线程环境下,使用HashMap进行put操作会引起死循环,导致CP

  • Java DFA算法案例详解

    1.背景 项目中需要对敏感词做一个过滤,首先有几个方案可以选择: 直接将敏感词组织成String后,利用indexOf方法来查询. 传统的敏感词入库后SQL查询. 利用Lucene建立分词索引来查询. 利用DFA算法来进行. 首先,项目收集到的敏感词有几千条,使用a方案肯定不行.其次,为了方便以后的扩展性尽量减少对数据库的依赖,所以放弃b方案.然后Lucene本身作为本地索引,敏感词增加后需要触发更新索引,并且这里本着轻量原则不想引入更多的库,所以放弃c方案.于是我们选定d方案为研究目标. 2.

  • Java AbstractMethodError原因案例详解

    背景 AbstractMethodError异常对于我来说还是比较不常遇见的,最近有幸遇到,并侥幸的解决了,在这里把此种场景剖析一番,进入正题,下面是AbstractMethodError在Java的异常机制中所处的位置: 现在明确了AbstractMethodError所具有的特性: 1.它是Error的子类,Error类及其子类都是被划分在非检查异常之列的,就是说这些异常不能在编译阶段被检查出来,只能在运行时才会触发. 2.通过API文档里面的解释大致得出的结论就是说A依赖于B,但是执行的时

  • Java Structs框架原理案例详解

    1 Struts2框架内部执行过程 Structs请求过程源码分析参考链接http://www.cnblogs.com/liuling/p/2013-8-10-01.html 从上图来看,整个框架的运行过程是围绕着核心过滤器StrutsPrepareAndExecuteFilter展开工作,深入到filter的源码会对理解有所帮助. 一个请求在Struts的处理中大概有以下几个步骤: 客户端初始化一个指向Servlet容器(Tomcat)的请求: 这个请求经过一系列的过滤器(Filter)例如A

  • Java DatabaseMetaData用法案例详解

    目录 一 . 得到这个对象的实例 二. 方法getTables的用法 三. 方法getColumns的用法 四.方法getPrimaryKeys的用法 五.方法.getTypeInfo()的用法 六.方法getExportedKeys的用法 一 . 得到这个对象的实例 Connection con ; con = DriverManager.getConnection(url,userName,password); DatabaseMetaData dbmd = con.getMetaData(

随机推荐