Java 并发收集少写多读

2024-01-19

我想使用基于比较器的键值映射。这将进行读取和罕见的写入操作(通过调度程序每 3 个月一次)。集合的初始加载将在应用程序启动时完成。 另请注意,写入将:

  • 将单个条目添加到地图
  • 不会修改地图的任何现有条目。

ConcurrentSkipListMap 会是一个很好的候选者吗?对此的 get 操作是否允许同时访问多个线程?我正在寻找并发非阻塞读取但原子写入。


ConcurrentHashMap https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html正是您正在寻找的。来自 Javadoc:

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

听起来它满足了您对“并发非阻塞读取但原子写入”的要求。

由于您执行的写入操作很少,因此您可能需要指定一个创建ConcurrentHashMap时的高loadFactor和适当的initialSize https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html#ConcurrentHashMap-int-float-int-,这将防止在填充地图时调整表大小,尽管这充其量只是一个适度的好处。 (您还可以将 concurrencyLevel 设置为 1,尽管 Java 8 的 Javadoc 似乎暗示它不再用作大小调整提示。)

If you 绝对必须有 a SortedMap https://docs.oracle.com/javase/8/docs/api/java/util/SortedMap.html or NavigableMap https://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html, then ConcurrentSkipListMap https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentSkipListMap.html是开箱即用的方法。但在使用它们之前,我会仔细检查您是否确实需要这些接口提供的功能(获取第一个/最后一个键、子图、查找附近的条目等)。您将付出高昂的代价(对于大多数操作,log n 与恒定时间)。

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

Java 并发收集少写多读 的相关文章

随机推荐

  • SwiftUI 模态演示仅在 navigationBarItems 中工作一次

    当您从导航栏项目内的按钮显示模式时 SwiftUI 中存在一个错误 在下面的代码中 按钮 1 按预期工作 但按钮 2 只工作一次 struct DetailView View Binding var isPresented Bool Env
  • 为什么不能使用具有多态返回类型的原始类型?

    考虑以下两个类 public interface Foo
  • 将 Java BigInteger 用于巨大位掩码的性能影响

    我们面临着一个有趣的挑战 我们必须控制对驻留在 容器 中的数据的访问 可能会有数十万个 垃圾箱 对每个垃圾箱的访问是单独控制的 但限制可能而且可能会重叠 我们正在考虑为每个 bin 分配位掩码中的一个位置 1 2 3 4 等 然后 当用户登
  • 使用参数 [null, 2, 3] 执行“INSERT INTO events (user_id, ET1, ET2) VALUES (?, ?, ?)”时发生异常:

    我正在尝试从默认控制器内部创建表单 我希望主页中两个下拉列表中的值都存储在事件表的 ET1 和 ET2 列中 我能够做到这一点 但是我希望登录用户的 user id 也应该存储在事件表的 user id 列中 当尝试这样做时 它给了我错误
  • 方法 Illuminate\Database\Eloquent\Collection::links 不存在

    我创建了用户和消息之间的模型关系 我想为经过身份验证的用户实现消息列表 但出现以下错误 方法 Illuminate Database Eloquent Collection links 不存在 控制器 public function ind
  • 当我使用快捷键时获取我的ContextMenuStrip的SourceControl

    我有单身ContextMenuStrip连接到两个控件 DataGridView In the ToolStripMenuItem单击事件 我设法得到原始调用者 DataGridView 用这个代码 var menu ToolStripDr
  • 查找 Excel 电子表格的模板路径

    我有一个带有 VBA 代码的 Excel 电子表格模板 xltm 文件 我想在模板打开的电子表格中找到模板的路径 问题示例 用户通过双击 C My Stuff 中的模板文件打开一个新电子表格 他们填写单元格 然后在询问他们的名称后单击一个按
  • MySQL所有父子关系

    我有一个名为table 它有一个名为id与类型INT 11 代表行的标识符 它还有其他字段 但我认为它们与这个问题无关 我有另一个表名为table children 它有一个名为parent与类型INT 11 指的是table id作为外键
  • 使用 1 位 ALU 制作 16 位 ALU

    你好 我正在尝试从几个 1 位 ALU 创建一个 16 位 ALU 我创建了一个名为 basic alu1 的包 其中包含 1 位 ALU 的组件 其代码是 library ieee use ieee std logic 1164 all
  • Arduino 中的字符串比较

    我正在开发基于网络的家庭自动化系统 因此我的Arduino向服务器发送请求并在串行监视器中获得以下响应以及 loneOn 这是由于Serial println r 陈述 HTTP 1 1 200 OK Date Mon 13 Oct 201
  • 使用 Boost.python 将 Python 列表传递给 C++ 向量

    如何传递对象类型的 Python 列表ClassName到一个接受a的C 函数vector
  • 如何防止我的应用程序在 iPhone 上后台运行

    有什么方法可以让应用程序在按下主页按钮时退出而不是进入后台吗 出于安全原因 如果应用程序不在后台运行 而是在按下主页时实际关闭 那就更好了 这是not为了用户的安全 而是为了应用程序上的公司数据 所以这不是用户的选择 除了强行退出之外 我找
  • Nodejs/V8 是否将编译后的机器代码存储在磁盘上的任何位置?

    Edit Node 从 Node 8 3 开始使用字节码 在此之前 源代码直接编译为机器代码 我进行了大量的 Python 编码 并且 pyc 文件中总是存在字节码 我想知道节点是否将其机器代码存储在类似的文件中 例如 将机器代码表示保留
  • 网络摄像机RTSP地址

    我有 IP 摄像头 但我不知道它是 RTSP 流的完整正确 URL 地址 仅 RTSP 设置中有端口 但据我了解 192 168 1 132 554 还不够 VLC 说找不到 rtsp 流 如何找出正确的 url 地址 如何找出正确的 ur
  • 复合主键是否为N-M关系?

    假设我们有 3 个表 实际上我现在有 2 个表 但这个例子可能会更好地说明这个想法 Person ID int 主键 名称 nvarchar xx Group ID int 主键 名称 nvarchar xx Role ID int 主键
  • Android Java:关闭屏幕

    我正在制作一个使用接近传感器打开和关闭屏幕的应用程序 接近代码已完成 但我在使用屏幕控件时遇到了麻烦 我读过我应该使用 PowerManager manager PowerManager getSystemService Context P
  • 为什么 MFMailComposeViewController 返回 MFMailComposeResultFailed?

    我的应用程序遇到一个奇怪的问题 我需要您的帮助 我正在使用 MFMailComposeViewController 发送带有附件数据的电子邮件 附件是 PDF CSV 或 XLS 文件 还可以将 ZIP 文件添加到邮件中 在大多数情况下一切
  • 关闭窗口前Socket.IO断开连接问题

    我试图阻止客户端与服务器断开连接 因此 在用户关闭打开应用程序的窗口之前 我会执行以下操作 window bind beforeunload function return Close the app 但问题是 无论用户选择离开还是留在应用
  • Groovy Node.depthFirst() 返回节点和字符串列表?

    我希望有人能指出我在这里遗漏的一些明显的东西 我觉得我已经这样做了一百次了 出于某种原因 今晚 由此产生的行为让我陷入了困境 我正在从公共 API 读取一些 XML 我想从某个节点中提取所有文本 body 内的所有内容 其中还包括各种子节点
  • Java 并发收集少写多读

    我想使用基于比较器的键值映射 这将进行读取和罕见的写入操作 通过调度程序每 3 个月一次 集合的初始加载将在应用程序启动时完成 另请注意 写入将 将单个条目添加到地图 不会修改地图的任何现有条目 ConcurrentSkipListMap