Java并发hashMap检索

2024-07-04

ConcurrentHashMap文档说:

检索操作(包括 get)通常不会阻塞,因此可能与更新操作(包括 put 和 remove)重叠。检索反映了最近完成的更新操作在其开始时的结果。 (更正式地说,给定键的更新操作与报告更新值的该键的任何(非空)检索具有发生之前关系。)

但我无法理解检索操作如何不会因同一密钥的更新/删除操作而阻塞?

“给定键的更新操作与该键的任何(非空)检索具有先发生关系”

这表明并发哈希映射有某种方式为同一键上的读取/更新/删除操作创建序列。但这意味着读取操作会被更新/删除操作阻止。

不知道我在这里缺少什么。


但我无法理解检索操作如何不会因同一密钥的更新/删除操作而阻塞?

首先,它“如何”实现是一个实现细节。如果你真的想/需要了解“如何”,你需要查看源代码。它可以从不同的地方获得。

但这实际上想说的是:

  • get不阻塞,并且
  • 当你做某事时你会看到什么get是来自的值最近完全的 put手术对于那把钥匙。

所以如果你做一个get而一个put正在进行中,您可能会看到之前的值put.

请注意,第二个要点解释了(隐含)why有可能get是非阻塞的。没有必要get(42)等待一个put(42, value)目前正在进行中......自get允许调用返回先前的值。

TL;DR - 无需阻止。


那些关于“发生在之前“关系将其与 Java 内存模型的语义联系起来。如果您正在对代码进行深入分析,这可能很重要。但是对于浅层理解什么ConcurrentHashMap确实如此,你可以忽略它。

...这表明并发哈希映射有某种方式为同一键上的读取/更新/删除操作创建序列。

这根本不意味着这一点。但要理解您引用的语句的真正含义,您需要对 Java 内存模型有很好的理解。我认为在 StackOverflow 问答中向您传达这一点是不可行的。我建议你拿几个hours阅读并理解 JMM ...通过阅读 JLS。然后,再做一次。

这不是凭直觉理解就足够的事情。

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

Java并发hashMap检索 的相关文章

  • Swing JEditorPane CSS 功能

    我正在 Swing JEditorPane 中显示 HTML 内容 为了更改 HTML 的默认外观 我使用了 CSS 样式表 这很好用 我的问题只是 JEditorPane 不支持完整的 CSS 规范 是否有 JEditorPane 支持的
  • 使用 Java 打开 Arduino 上的 LED

    我安装了 Java 串行 RXTX 库并正确设置了 Arduino 我什至已经启动并运行了示例代码 但我似乎无法理解如何访问不同的 Arduino 引脚以打开 LED 等 如何使用 OutputStream 或任何其他方式访问引脚 我是否需
  • 在资源控制器内使用多个服务的最佳方法是什么?

    我有一个调用三个服务的控制器 public class ProductController Autowired private AccountService accountService Autowired private ProcessS
  • 如何将 XML 文件直接写入 zip 存档?

    在不使用第 3 方库的情况下 使用 JAXB 直接将 XML 文件列表写入 zip 存档的正确方法是什么 将所有 XML 文件写入一个目录然后压缩会更好吗 正如其他人指出的那样 您可以使用ZipOutputStream类来创建 ZIP 文件
  • Java自动将集合转换为参数数组?

    我知道Java 数组参数语法可以接收数组作为参数 或者只是传递给方法的许多参数 然而 我注意到它对于集合也是如此 public static void main String args Collection objects new Arra
  • 如何安装Slick2d?

    您好 我正在尝试使用 LWJGL 库和 Slick2D 游戏库创建一个游戏 但是当我尝试运行它时出现错误 这是我的代码 package test import org newdawn slick AppGameContainer impor
  • Google Play 游戏服务 - 自定义通知/欢迎回来

    我一直在互联网上查找 但找不到我的答案 有没有办法向用户显示他们已登录 GPGS 第一次登录时 您会收到一条通知 内容为 欢迎 但是当您下次打开应用程序时 什么也没有显示 有没有办法显示欢迎回来通知 对于 iOS 这是可能的 在第 9 步上
  • 隐藏另一个布局的浮动操作按钮

    我有一个FloatingActionButton五月之内activity main xml名为的布局fabBtn 我的应用程序是用ViewPager和三个Fragments 我想隐藏FloatingActionButton当我的第一次Fra
  • Java并发hashMap检索

    ConcurrentHashMap文档说 检索操作 包括 get 通常不会阻塞 因此可能与更新操作 包括 put 和 remove 重叠 检索反映了最近完成的更新操作在其开始时的结果 更正式地说 给定键的更新操作与报告更新值的该键的任何 非
  • **线程“main”中的异常java.util.InputMismatchException**

    我正在尝试从 txt 文件中获取一些记录并将其放入以下 Java 程序的数据库中 package Java Demo import java sql import java util import java io public class
  • Spring Actuator 可以与非 Web Spring Boot 应用程序一起使用吗?

    我有一个 Spring Boot 应用程序 它侦听来自 IBM MQ 输入队列的消息 对消息进行一些处理 然后将消息放入输出队列 像这样的应用程序可以利用Spring执行器来监视应用程序 例如心跳检查 吗 从执行器文档来看 它似乎只能与 S
  • ClassLoader.getResourceAsStream 如何工作?

    我用 maven 创建了一个 jar 文件 当我打开这个罐子时 我可以找到以下内容 my jar text1 txt folder some other stuff 当我在 Eclipse 中运行此代码片段时 打印出 text1 txt 的
  • Android onBackPressed() 没有被调用?

    在我的 MainActivity 从 AppCompatActivity 扩展 中 我想重写 onBackPressed 方法 如下所示 Override public void onBackPressed Log d MainActivi
  • Jenkins 中的算法协商失败 SSH

    我正在尝试从 Jenkins ssh 到本地服务器 但抛出以下错误 SSH Exception Algorithm negotiation fail com jcraft jsch JSchException Algorithm negot
  • 终极Java版本表(J2EE、Java EE、Servlet、JSP、JSTL)

    我正在寻找 Java EE 或以前称为 J2EE 和 Java SE 的组件分解 E g J2EE 1 3 Servlet 2 3 JSP 1 2 JSTL 1 0 J2EE 1 4 Servlet 2 4 JSP 2 0 JSTL 1 1
  • 相对于当前日期对 Java 集合进行排序

    我想相对于当前日期对日期列表进行排序 例如列表中有下一项 10 01 2018 10 20 2018 10 14 2018 10 02 2018 当前日期是10 08 2018 结果应该是按下一个顺序升序排列的数组 10 14 2018 1
  • 通过解析异常获取方法名及其包含的参数

    当我收到异常时 例如IOException or RunTimeException 我只能知道班级里的行号 首先是我的问题 是否可以通过异常检索方法名称 其次 是否可以通过行号检索该方法以及该方法的参数 附注我需要知道确切的方法名称及其参数
  • Django 会话竞争条件?

    摘要 Django 会话中是否存在竞争条件 如何防止它 我在 Django 会话方面遇到了一个有趣的问题 我认为该问题涉及由于同一用户同时发出请求而导致的竞争条件 它发生在一个同时上传多个文件的脚本中 正在本地主机上进行测试 我认为这使得同
  • GWT 的图表和绘图 API

    我正在尝试找到一个可以在 GWT 中使用 java 而不是 javascript 使用的图表和绘图 api 我遇到的唯一问题是我发现需要互联网连接的代码将无法连接到互联网 有谁知道这样的API吗 这是我找到的 但又无法使用 https co
  • 使用 Apache CXF 2.4 JAX-RS 和 Spring Security 3.2 获取用户名

    我在 JAX RS 资源中获取用户名SecurityContextHolder这有效 Path myresource public class MyResoure Get public String getUserName return S

随机推荐