为什么同步变更操作时还需要同步HashMap.get(key)?

2023-12-26

我用.get(...), .put(...) and .clear()多个线程对一个 HashMap 进行操作。.put(...) and .clear()都在一个里面synchronized阻止但是.get(...)不是。我无法想象这会导致问题,但在我见过的其他代码中.get()几乎总是同步的。

获取/放置的相关代码

Object value = map.get(key);
if(value == null) {
  synchronized (map) {
    value = map.get(key); // check again, might have been changed in between
    if(value == null) {
      map.put(key, new Value(...));
    }
  }
}

清楚的是:

synchronized (map) {
  map.clear();
}

由于同步和同步,写操作将使缓存失效get(...)返回 null 或实例。我真的看不出什么地方会出问题,或者通过把.get(...)操作成synchronized(map) block.


这是一个简单的场景,会在不同步时产生问题get:

  • 线程A启动get,计算哈希桶号,并被抢占
  • 线程B调用clear(),因此分配了较小的桶数组
  • 线程A醒来,可能会遇到索引越界异常

这是一个更复杂的场景:

  • 线程 A 锁定地图以进行更新,并被抢占
  • 线程B发起一个get操作,计算哈希桶数,并被抢占
  • 线程A醒来,并继续put,并意识到存储桶需要调整大小
  • 线程 A 分配新的存储桶,将旧内容复制到其中,并添加新项目
  • 线程 B 醒来,并使用旧存储桶索引在新存储桶数组上继续搜索。

此时,线程 B 可能无法找到正确的项目,因为它很可能位于不同索引的哈希桶中。因此get也需要同步。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么同步变更操作时还需要同步HashMap.get(key)? 的相关文章

  • 对话框上的 EditText 不返回任何文本

    我太累了 找不到错误 我没有发现任何错误 但我没有从 editText 收到任何文本 请看下面的代码 活动密码 xml
  • numba 函数何时编译?

    我正在研究这个例子 http numba pydata org numba doc 0 15 1 examples html multi threading http numba pydata org numba doc 0 15 1 ex
  • Spring安全“记住我”cookie在第一个请求中不可用

    我无法在登录请求后检索 Spring 记住我 cookie 但它在对受保护页面的下一个请求中工作正常 谁能告诉我怎样才能立即得到它 我在登录请求中设置了记住我的 cookie 但在 Spring 重定向回原始 受保护的 url 后无法检索它
  • 通过 ruby​​ 进程共享变量

    我正在编写一个 gem 其中我必须分叉两个进程来启动两个 webrick 服务器 我想通过基类的类方法启动该服务器 因为应该只运行这两个服务器 而不是多个服务器 在运行时 我想调用这两台服务器上的一些方法来更改变量 我的问题是 我无法通过基
  • eclipse中导入项目文件夹图标

    我在 Eclipse 工作区中新导入的 Maven 项目有J and M项目文件夹顶部的图标 项目和包资源管理器 而其他导入的 Maven 项目只有一个J icon 有人可以解释其中的区别吗 该项目有J装饰器被称为 Java 项目和具有M装
  • 在文本文件中搜索单词并返回其频率

    如何在包含单词文本的文本文件中搜索特定单词并返回其频率或出现次数 使用扫描仪 String text Question how to search for a particular word in a text file containin
  • 使用 RecyclerView 适配器在运行时更改布局屏幕

    我有两个布局文件 如下所示 如果列表中存在数据 则我显示此布局 当列表为空时 我会显示此布局 现在我想在运行时更改布局 当用户从列表中删除最后一项时 我想将布局更改为第二张图片中显示的 空购物车布局 In getItemCount Recy
  • 如何将 android.net.Uri 转换为 java.net.URL? [复制]

    这个问题在这里已经有答案了 有没有办法从Uri to URL 我正在使用的库需要这个 它only接受一个URL但我需要在我的设备上使用图像 如果该方案的Uri is http or https new URL uri toString 应该
  • RSA OAEP、Golang 加密、Java 解密 -BadPaddingException:解密错误

    我正在尝试解密使用 RSA OAEP 在 Golang 中加密的字符串 但出现 BadPaddingException 解密错误 很难弄清楚我错过了什么 这是Golang加密方法 func encryptString rootPEM io
  • 如何在进入新活动之前终止线程和处理程序

    大家好 在我尝试清理处理程序时 这段代码可能有点混乱 因为我一直在尝试追踪崩溃发生的位置 我有一个对话框活动 显示密码输入 进度条由线程和处理程序动画显示 似乎当我试图查看进度条是否完成并尝试终止线程时 当我尝试进入新活动时 我这样做的方式
  • 获取给定类文件的目录路径

    我遇到的代码尝试从类本身的 class 文件所在的同一目录中读取一些配置文件 File configFiles new File this getClass getResource getPath listFiles new Filenam
  • 计算日期之间的天数差异

    在我的代码中 日期之间的差异是错误的 因为它应该是 38 天而不是 8 天 我该如何修复 package random04diferencadata import java text ParseException import java t
  • 在 Spring Boot Actuator 健康检查 API 中启用日志记录

    我正在使用 Spring boot Actuator APIproject https imobilenumbertracker com 拥有一个健康检查端点 并通过以下方式启用它 management endpoints web base
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 解析输入,除了 System.in.read() 之外不使用任何东西

    我很难找到具体的细节System in read 有效 也许有人可以帮助我 似乎扫描仪会更好 但我不允许使用它 我被分配了一个任务 我应该以 Boolean Operator Boolean 的形式读取控制台用户输入 例如T F 或 T T
  • 如何通过 Inno Setup for NetBeans 使用自定义 .iss 文件

    我将 Inno Setup 5 与 NetBeans 8 一起使用 并且我已经能够创建一个安装程序来安装该应用程序C users username local appname 但是我希望将其安装在C Programfiles 我如何在 Ne
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do
  • 哪个集合更适合存储多维数组中的数据?

    我有一个multi dimensional array of string 我愿意将其转换为某种集合类型 以便我可以根据自己的意愿添加 删除和插入元素 在数组中 我无法删除特定位置的元素 我需要这样的集合 我可以在其中删除特定位置的数据 也
  • Java的-XX:+UseMembar参数是什么

    我在各种地方 论坛等 看到这个参数 并且常见的答案是它有助于高并发服务器 尽管如此 我还是找不到 sun 的官方文档来解释它的作用 另外 它是Java 6中添加的还是Java 5中存在的 顺便说一句 许多热点虚拟机参数的好地方是这一页 ht
  • Android 和 Java 中绘制椭圆的区别

    在Java中由于某种原因Ellipse2D Double使用参数 height width x y 当我创建一个RectF在Android中参数是 left top right bottom 所以我对适应差异有点困惑 如果在 Java 中创

随机推荐

  • Linq to SQL / 过滤重复项

    我的 sql server 2012 中有一个视图 其中有几个重复项 我想按最新的对它们进行排序并过滤所有其他的 谁能帮助我 我对 SQL Server 2012 的看法 GUID 作为主键 数字 日期时间和名称 guid number d
  • 在 IISExpress 中获取 ASP.Net Core 关闭触发 ApplicationStopping 事件

    我知道之前有一个关于此问题的问题 还有一个 GitHub 问题 https github com aspnet Hosting issues 846 https github com aspnet Hosting issues 846从 M
  • 对于 genericsetup 导入步骤的名称,是否有一个很好的参考列表

    是否有通用设置导入步骤名称的综合参考列表 通用设置导入步骤的名称并不总是与其相应 xml 文件的名称匹配 例如 types xml 有一个名为 typeinfo 的导入步骤 如果没有列表 我会对一种简单的方法来查找导入步骤的名称感到满意 例
  • 学习 Hibernate 的好书或在线资源 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • boost::circular_buffer 相当于文件吗?

    我正在寻找一个允许在磁盘上获取循环缓冲区的库 在 Boost 中也有类似的东西 但它是一个基于内存的容器 循环缓冲区 http www boost org doc libs 1 57 0 doc html circular buffer h
  • 在 Linux 下启动时运行 ASP.NET Core 应用程序

    我想在 Linux 下运行我的 ASP NET Core 解决方案 并在启动时运行结果 来自微软docs https learn microsoft com en us aspnet core host and deploy linux n
  • CustomScrollView 内的 TabView

    用 SliverFillRemaining 包裹 TabBarView 像 Expanded 一样填充剩余的空白空间 会产生以下错误输出 flutter RenderPositionedBox 需要 RenderBox 类型的子代 但收到了
  • 编码为 base64 密钥库文件

    我想对我的 keystore 文件进行编码以在 Gitlab ci 中使用 因此 对于 Base64 编码 我运行以下命令 openssl base64 A in myFile keystore 对于解码 openssl base64 d
  • 如何为 TextView 中的文本更改添加动画效果?

    尝试执行以下操作 animTimeChange AnimationUtils loadAnimation this android R anim slide in left itemTime startAnimation animTimeC
  • 在单个剃刀视图中,如何检索从控制器的不同方法传递的值?

    我正在开发一个基本应用程序 这是主控制器 public ActionResult Index var all context mainz ToList var vm new mainViewModel main lst all return
  • 在 Excel 用户窗体中,如何更新标签的标题?

    我创建了我的第一个无模式UserForm在 Excel 中并在其上放置 ActiveX 标签 如何设置标签的标题 以便它显示其中的内容Sheet1 Range A1 并在单元格 A1 中的值发生变化时自行更新 基本上 我想要Userform
  • Haskell 集合可以保证每个操作的最坏情况范围?

    这种结构对于实时应用程序 例如用户界面 是必要的 用户并不关心单击按钮是否需要 0 1 秒或 0 2 秒 但他们确实关心第 100 次单击是否会强制执行出色的惰性计算并需要 10 秒才能继续 我在读冈崎的论文纯函数式数据结构 http ww
  • Python 在打印变量后打印文本

    所以我想在打印变量后打印一些文本 如下所示 print Blablabla var blablabla 现在看起来像这样 print The enemey gets hit for d damage 我想在打印损坏变量后打印 Hitpoin
  • ole32!COIDTable::ThreadCleanup 中崩溃 ... NetworkItemFactory!FDBackgroundThreadHandler

    自上周以来 Word 和 Excel 经常崩溃 即使是非常简单的文档也是如此 刚才 火狐也崩溃了 我该如何修复它或找到真正的根本原因 我已经使用安装程序修复了 Office 安装 应安装所有常规更新 笔记本电脑每天都会重新启动 我已经配置了
  • 在 IIS 上启用 SSI

    根据这一页 http msdn microsoft com en us library ms525940 28v vs 90 29 aspx 我应该能够 问 如何在 IIS7 上启用 SSI 编辑 哦 我明白我的问题是什么了 我在 VPS
  • git-diff:不考虑行顺序

    我的存储库中有一个由软件程序生成的文件 该程序有时会重新排序该文件上的行 这并不重要 因为行顺序并不重要 问题是 当执行 git diff 时 很难看出任何内容是否真正发生了变化 无论如何 是否有执行不考虑行顺序的差异 或者 如果 git
  • 如何在 Swift 中获取父 ViewController 的类名?

    有没有办法获取当前 子 父VC的类名UIViewController 我的 孩子 VC 推 有两个 父母 UIViewControllers 所以我想知道哪一位是当前的父母 这是一种方法 if let parentVC parent as
  • Vector3 的纬度和经度未在 3D 球体上对齐

    我正在尝试将纬度和经度转换为 Vector3 格式 对于给定的纬度和经度 我想将其转换为 Vector3 其中标记对象将位于此 Vector3 位置 这是我的代码 void createLand double latitude rad la
  • python中在函数中定义函数有什么好处?

    我遇到了这段python代码 粘贴在下面 effbot http effbot org zone re sub htm unescape html我想知道 为什么要在函数中定义函数 import re htmlentitydefs Remo
  • 为什么同步变更操作时还需要同步HashMap.get(key)?

    我用 get put and clear 多个线程对一个 HashMap 进行操作 put and clear 都在一个里面synchronized阻止但是 get 不是 我无法想象这会导致问题 但在我见过的其他代码中 get 几乎总是同步