当前位置: 首页 > 面试题库 >

使用Java ConcurrentHashMap实现缓存

南宫才英
2023-03-14
问题内容

我想在Web Java应用程序中实现重量级对象的简单缓存。但是我不知道该怎么做。

我是否缺少某些东西或ConcurrentHashMap方法(putIfAbsent等)还不够,是否需要额外的同步?

是否有更好的简单API(在内存存储中,没有外部配置)来执行此操作?

P.


问题答案:

如果为要缓存的内容临时拥有多个实例是安全的,则可以执行“无锁”缓存,如下所示:

public Heavy instance(Object key) {
  Heavy info = infoMap.get(key);
  if ( info == null ) {
    // It's OK to construct a Heavy that ends up not being used
    info = new Heavy(key);
    Heavy putByOtherThreadJustNow = infoMap.putIfAbsent(key, info);
    if ( putByOtherThreadJustNow != null ) {
      // Some other thread "won"
      info = putByOtherThreadJustNow;
    }
    else {
      // This thread was the winner
    }
  }
  return info;
}

多个线程可以“竞争”来创建和添加密钥项,但是只有一个应该“获胜”。



 类似资料:
  • 问题内容: 我试图使用LinkedHashMap实现LRU缓存。在LinkedHashMap的文档(http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html)中,它表示: 请注意,如果将密钥重新插入到映射中,则插入顺序不会受到影响。 但是当我做以下推 输出是 这表明重新插入确实影响了订单。有人知道任何解释吗? 问题答

  • 问题内容: 最少使用(LFU)是一种高速缓存算法,用于管理计算机内的内存。此方法的标准特性涉及系统跟踪内存中块被引用的次数。当缓存已满且需要更多空间时,系统将以最低参考频率清除项目。 例如,用Java来实现最近使用的对象缓存的最佳方法是什么? 我已经使用LinkedHashMap实现了一个(通过保持访问对象的次数),但是我很好奇是否有任何新的并发集合会更好。 考虑这种情况:假设缓存已满,我们需要为

  • 本文向大家介绍SpringBoot使用Redis缓存的实现方法,包括了SpringBoot使用Redis缓存的实现方法的使用技巧和注意事项,需要的朋友参考一下 (1)pom.xml引入jar包,如下:   (2)修改项目启动类,增加注解@EnableCaching,开启缓存功能,如下:   (3)application.properties中配置Redis连接信息,如下:   (4)新建Redis

  • 本文向大家介绍js使用Promise实现简单的Ajax缓存,包括了js使用Promise实现简单的Ajax缓存的使用技巧和注意事项,需要的朋友参考一下 业务场景 在不少业务场景下,我们需要实现简单的请求缓存(即某个请求只发起一次请求),例如上传 Token 的获取、获取配置的接口等。 这些接口可以通过 Promise 实现简单的缓存并能够控制更新,而不需要另外引入缓存层。 示范代码 用七牛上传作例

  • 是否有任何方法可以使用实现文件追加器,它将在内存中存储特定大小的日志,然后将日志写入文件(本地/远程) 有什么办法可以做到这一点吗? 在log4j2文档中: FastFileAppender与标准的类似,只是它总是被缓冲(不能关闭),并且在内部使用而不是。与使用“” bufferedIO:(布尔值)的FileAppender相比,我们看到了20-200%的性能改进。如果为true,则默认情况下,当

  • 本文向大家介绍详解Spring Boot使用redis实现数据缓存,包括了详解Spring Boot使用redis实现数据缓存的使用技巧和注意事项,需要的朋友参考一下 基于spring Boot 1.5.2.RELEASE版本,一方面验证与Redis的集成方法,另外了解使用方法。 集成方法 1、配置依赖 修改pom.xml,增加如下内容。 2、配置Redis 修改application.yml,增