HashMap 缓存中的同步

2023-11-26

我有一个网络应用程序,人们可以在其中请求资源。为了提高效率,这些资源使用同步哈希图进行缓存。这里的问题是,当两个不同的请求同时针对同一未缓存的资源时:检索资源的操作会占用大量内存,因此我想避免对同一资源多次调用它。

有人可以告诉我以下代码片段是否存在任何潜在问题吗?提前致谢。

private Map<String, Resource> resources = Collections.synchronizedMap(new HashMap<String, Resource>());

public void request(String name) {

  Resource resource = resources.get(name);

  if (resource == null) {
    synchronized(this) {
      if (resources.get(name) == null) {
        resource = veryCostlyOperation(name); // This should only be invoked once per resource...
        resources.put(resource);
      } else {
        resource = resources.get(name);
      }
    }
  }

  ...

}

一个可能的问题是您通过执行创建了不必要的争用veryCostlyOperation()里面一个synchronized阻塞,因此许多线程无法同时检索其(独立)资源。这可以通过使用来解决Future<Resource>作为地图的值:

Map<String, Future<Resource>> map = new ConcurrentHashMap<String, Future<Resource>>();    
...
Future<Resource> r = map.get(name);
if (r == null) {
    FutureTask task = null;
    synchronized (lock) {
        r = map.get(name);
        if (r == null) {
            task = new FutureTask(new Callable<Resource>() {
                public Resource call() {
                    return veryCostlyOperation(name);
                }
            });
            r = task;
            map.put(name, r);
        }
    }
    if (task != null) task.run(); // Retrieve the resource
}

return r.get(); // Wait while other thread is retrieving the resource if necessary
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HashMap 缓存中的同步 的相关文章

  • 如何在 JSP 中导入类?

    我是一个完全的JSP初学者 我正在尝试使用java util List在 JSP 页面中 我需要做什么才能使用除以下类之外的类java lang 使用以下导入语句进行导入java util List 顺便说一句 要导入多个类 请使用以下格式
  • 使用 RecyclerView 适配器在运行时更改布局屏幕

    我有两个布局文件 如下所示 如果列表中存在数据 则我显示此布局 当列表为空时 我会显示此布局 现在我想在运行时更改布局 当用户从列表中删除最后一项时 我想将布局更改为第二张图片中显示的 空购物车布局 In getItemCount Recy
  • Condition 接口中的 signalAll 与对象中的 notificationAll

    1 昨天我才问过这个问题条件与等待通知机制 https stackoverflow com questions 10395571 condition vs wait notify mechanism 2 我想编辑相同的内容并在我的问题中添加
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • 内存一致性 - Java 中的happens-before关系[重复]

    这个问题在这里已经有答案了 在阅读有关内存一致性错误的 Java 文档时 我发现与创建 发生 之前 关系的两个操作相关的点 当语句调用时Thread start 每个具有 与该语句发生之前的关系也有一个 与 new 执行的每个语句之间发生的
  • 如何从 Retrofit2 获取字符串响应?

    我正在做 android 正在寻找一种方法来执行超级基本的 http GET POST 请求 我不断收到错误 java lang IllegalArgumentException Unable to create converter for
  • Java:正则表达式排除空值

    在问题中here https stackoverflow com questions 51359056 java regexp for a separated group of digits 我得到了正则表达式来匹配 1 到 99 之间的一
  • Java 服务器-客户端 readLine() 方法

    我有一个客户端类和一个服务器类 如果客户端向服务器发送消息 服务器会将响应发送回客户端 然后客户端将打印它收到的所有消息 例如 如果客户端向服务器发送 A 则服务器将向客户端发送响应 1111 所以我在客户端类中使用 readLine 从服
  • Java 8 中函数式接口的使用

    这是来自的后续问题Java 8 中的 双冒号 运算符 https stackoverflow com questions 20001427 double colon operator in java 8其中 Java 允许您使用以下方式引用
  • 如何在进入新活动之前终止线程和处理程序

    大家好 在我尝试清理处理程序时 这段代码可能有点混乱 因为我一直在尝试追踪崩溃发生的位置 我有一个对话框活动 显示密码输入 进度条由线程和处理程序动画显示 似乎当我试图查看进度条是否完成并尝试终止线程时 当我尝试进入新活动时 我这样做的方式
  • 计算日期之间的天数差异

    在我的代码中 日期之间的差异是错误的 因为它应该是 38 天而不是 8 天 我该如何修复 package random04diferencadata import java text ParseException import java t
  • Cloudfoundry:如何组合两个运行时

    cloundfoundry 有没有办法结合两个运行时环境 我正在将 NodeJS 应用程序部署到 IBM Bluemix 现在 我还希望能够执行独立的 jar 文件 但应用程序失败 APP 0 bin sh 1 java not found
  • Spring Security OAuth2简单配置

    我有一个简单的项目 需要以下简单的配置 我有一个 密码 grant type 这意味着我可以提交用户名 密码 用户在登录表单中输入 并在成功时获得 access token 有了该 access token 我就可以请求 API 并获取用户
  • 在 Spring Boot Actuator 健康检查 API 中启用日志记录

    我正在使用 Spring boot Actuator APIproject https imobilenumbertracker com 拥有一个健康检查端点 并通过以下方式启用它 management endpoints web base
  • Android Studio 将音乐文件读取为文本文件,如何恢复它?

    gameAlert mp3是我的声音文件 运行应用程序时 它询问我该文件不与任何文件类型关联 请定义关联 我选择TextFile错误地 现在我的音乐文件被读取为文本文件 我如何将其转换回music file protected void o
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • 尝试使用等于“是”或“否”的字符串变量重新启动 do-while 循环

    计算行程距离的非常简单的程序 一周前刚刚开始 我有这个循环用于解决真或假问题 但我希望它适用于简单的 是 或 否 我为此分配的字符串是答案 public class Main public static void main String a
  • Hibernate 和可序列化实体

    有谁知道是否有一个框架能够从实体类中剥离 Hibernate 集合以使它们可序列化 我查看了 BeanLib 但它似乎只进行实体的深层复制 而不允许我为实体类中的集合类型指定实现映射 BeanLib 目前不适用于 Hibernate 3 5
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文
  • JAXB - 列表<可序列化>?

    我使用 xjc 制作了一些课程 public class MyType XmlElementRefs XmlElementRef name MyInnerType type JAXBElement class required false

随机推荐

  • 导航栏隐藏时的假状态栏颜色

    我遇到了状态栏和导航栏的问题 默认情况下导航栏UINavigationController延伸到状态栏后面并为其着色 左屏幕截图 当使用搜索栏时 我隐藏导航栏 这会导致状态栏不着色 Apple 的邮件应用程序不存在此问题 除了创建一个带有背
  • 设置enforce_available_locales = true后,Rails I18n验证弃用警告

    你把这样的东西放在config application rb I18n enforce available locales true config i18n load path Dir Rails root join config loca
  • 使用陀螺仪滚动图像时遇到问题

    我的 iPad Air 遇到了一个奇怪的问题 我的代码在 iPad 3 iPad 4 iPhone 5S iPod 5th Gen 上运行良好 但在 iPad Air 上 我的图像会自动滚动 无需用户旋转设备 这是我的代码 property
  • 为什么 Symfony 仍然记录到 dev.log 文件,即使我没有在日志处理程序中定义它?

    在执行 Symfony 命令期间 我想将消息记录到不同的文件中 我已经阅读了 Symfony 和 Monolog 文档 它应该像我在这里描述的那样工作 请注意 我知道来自 教义 事件 等通道的消息仍将由主处理程序记录 但这对我来说并不重要
  • 如何在我的 C# 控制器中获取 Ajax 发布的数组?

    我使用 ASP NET MVC 我尝试在 ajax 中发布一个数组 但我不知道如何将它获取到我的控制器中 这是我的代码 Ajax var lines new Array lines push ABC lines push DEF lines
  • 如何获取mp3文件的大小和持续时间?

    我需要计算 mp3 文件的总长度 目前我正在使用我发现的 PHP 类 http www zedwood com article php calculate duration of mp3 如果 mp3 文件位于同一服务器中 则此操作完美 但
  • 用 Python 计算 XIRR

    我需要计算一段时间内进行的金融投资的 XIRR numpy pandas 或普通 python 中是否有任何函数可以执行此操作 参考 什么是 XIRR 原问题中接受的答案不正确 可以改进 创建了一个用于快速 XIRR 计算的包 PyXIRR
  • 最大字符串内容长度配额(8192)

    反序列化操作 CreateTransactionEntity 的回复消息正文时出错 读取 XML 数据时超出了最大字符串内容长度配额 8192 通过更改创建 XML 读取器时使用的 XmlDictionaryReaderQuotas 对象的
  • Rust 中 C++ 的 shared_ptr 的等价物是什么?

    为什么 Rust 不允许这种语法 fn main let a String from ping let b a println a b 当我尝试编译这段代码时 我得到 error E0382 use of moved value a gt
  • 清理基于 Play 框架的项目

    运行新的后Play framework 2 0基于项目 我未能清理它 生成的工作人员仍然在下面 play new myapp gt app name myapp gt template java app myapp app controll
  • swift 代码崩溃,日志:dyld:未加载库:@rpath/libswiftCore.dylib

    我调试了一个简单的swift app 它在模拟器中可以正常运行 但是在真机上运行就立即崩溃 系统版本 ios 8 xcode版本 6 0 1 崩溃日志 dyld 未加载库 rpath libswiftCore dylib 引用自 priva
  • openCV 的 HSV 色轮图像?

    我已经编写了直方图代码 我想将其用于 SVM 训练 但根本问题是 我不明白应该选择多少个最小数量的垃圾箱 以便我可以在不同颜色 红色 绿色 黄色 蓝色 橙色 的垃圾箱之间获得广泛不同的分布 那么 有人可以给我链接 发布图像吗openCV 的
  • 配置 Gunicorn:未指定应用程序模块

    我正在尝试使用 NGINX 和 Gunicorn 部署 django 项目 我不断收到 502 Bad Gateway 过去几天我一直在不停地工作 但似乎无法部署它 我已经阅读了 3 个关于 Digital Ocean 的教程 但显然它们都
  • 如何在 React Context 中传递 State

    我试图通过并更新一个状态useContext App js import Home from components Home const UserContext createContext function App const name s
  • 拒绝:“2.23:应用程序必须遵循 iOS 数据存储指南”,我们没有在文档文件夹中保存任何数据

    我们的App被App拒绝了 原因是 2 23 我们发现您的应用程序不遵循iOS数据存储 指南 这是 App Store 审核指南所要求的 特别是 我们发现在启动和 或内容下载时 您的 应用程序存储超过 2 MB 的数据 要检查您的应用程序存
  • 为什么不能在没有括号的内插字符串中使用条件运算符? [复制]

    这个问题在这里已经有答案了 为什么我不能在 c 6 字符串插值中使用内联条件运算符 而不将其包含在括号内 和错误 正如您所看到的 解析器似乎遇到了困难 这是一个错误 还是字符串插值机制的一个特性 From MSDN 强调我的 person
  • 如何知道 UITableView 中 Tableview 单元格按钮单击的索引路径/行? [复制]

    这个问题在这里已经有答案了 我创建了一个具有自定义 UITableViewCell 的 TableView 一个按钮与表格视图的每一行相关联 现在我想知道单击按钮时的行号 以便我知道单击了哪个行按钮 我尝试了在堆栈上找到的一些东西 但没有任
  • 是否可以更改 Xcode 缩进注释块的方式?

    默认情况下 Xcode 自动将 C 风格注释块中的多行代码缩进一个空格 this is a comment block line 1 line 2 是否可以修改此行为 我希望评论块内没有缩进 这不是一个完整的答案 但 Xcode 在该键下有
  • PHP - 无法打开流:没有这样的文件或目录

    在PHP脚本中 是否调用include require fopen 或它们的衍生物 例如include once require once 甚至 move uploaded file 人们经常遇到错误或警告 无法打开流 没有这样的文件或目录
  • HashMap 缓存中的同步

    我有一个网络应用程序 人们可以在其中请求资源 为了提高效率 这些资源使用同步哈希图进行缓存 这里的问题是 当两个不同的请求同时针对同一未缓存的资源时 检索资源的操作会占用大量内存 因此我想避免对同一资源多次调用它 有人可以告诉我以下代码片段