“原子”更新整个数组

2023-12-26

我有一个编写器线程和一个读取器线程来更新和处理数组池(存储在地图中的引用)。写入与读取的比率几乎为 5:1(写入的延迟是一个问题)。

编写器线程需要根据某些事件更新池中数组的几个元素。整个写入操作(所有元素)需要是原子的。

我想确保如果编写器线程正在更新它,则读取器线程会读取先前更新的数组(类似于 挥发性的东西,但在整个数组而不是单个字段上)。基本上,我可以读取陈旧的值,但不能阻止。

此外,由于写入如此频繁,因此在读/写时创建新对象或锁定整个数组的成本非常昂贵。

是否有可以使用更有效的数据结构或使用更便宜的锁?


这个想法怎么样:编写器线程不会改变数组。它只是将更新排队。

读取器线程每当进入需要阵列稳定快照的读取会话时,都会将排队的更新应用于阵列,然后读取该阵列。

class Update
{
    int position;
    Object value;
}

ArrayBlockingQueue<Update> updates = new ArrayBlockingQueue<>(Integer.MAX_VALUE);

void write()
{
    updates.put(new Update(...));
}

Object[] read()
{
    Update update;
    while((update=updates.poll())!=null)
        array[update.position] = update.value;

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

“原子”更新整个数组 的相关文章

随机推荐

  • 如何强制列表对象输入“double”

    代码 a lt structure list X Days c 10 38 66 101 129 185 283 374 Names X Days Then a is like X Days 1 10 38 66 101 129 185 2
  • 使用 https 时基于主机的 nginx 代理

    我需要使用 Nginx 作为 SSL 代理 它根据子域将流量转发到不同的后端 我似乎到处都应该定义多个 server 部分 但这对于 SSL 来说不能正常工作 这样做时 我始终会在第一个虚拟主机中处理 SSL 因为在处理 https 流量之
  • 无法在 macOS Monterey 12.3 上安装 psycopg2-binary

    我一直在尝试为我的 django 项目安装 psycopg2 binary 但到目前为止没有任何效果 它不断要求pg config文件 据我所知 只有在构建 psycopg2 时才需要该文件 那么 这里发生了什么 Collecting ps
  • VS 2013 ASP.NET调试时无法修改代码

    我正在处理一个 ASP NET 2 0 项目 该项目已从 vs 2005 gt 2010 gt 2013 升级 在 vs 2005 和 2010 中 我可以在调试时修改代码 保存更改并重新加载应用了更改的页面 现在与 2013 年相比 我无
  • 在 C 中区分 typedef 的类型/标记名称有哪些优点?

    一些代码库使用不同的标识符tag和type eg typedef struct foo int bar foo 代替 typedef struct foo int bar foo 这里详细解释了这些差异 C 中 struct 和 typed
  • 在 R 中的 for 循环中创建列

    我在 R 中有一个数据框 我想在 for 循环中创建新列 在过去的两天里我尝试了很多事情但没有成功 最后 我确实找到了一个似乎可行的解决方案 但看起来并不那么直接 我想知道是否有人有更优雅的方法来做到这一点 抱歉 如果这个问题已经得到解决
  • 使用 D3.js 为每个数据成员附加多个非嵌套元素

    我想使用 d3 创建多个非嵌套元素来创建如下结构 div p from data 0 p p from data 0 p p from data 1 p p from data 1 p p from data 2 p p from data
  • TSQL - 如何判断 SQL 是否是集群的?

    有没有办法使用 TSQL CMD 脚本或 VB 脚本来告诉 1 如果 SQL Server 集群在服务器上 并且 2 是否是主动节点 Thanks 这两个都可以使用找到 SELECT FROM fn virtualservernodes 如
  • Tensorflow编译运行很长时间

    所以我正在尝试编译TensorFlow来自源头 使用 2019 年 1 月 31 日的 git 存储库中的克隆 我从他们的 shell 脚本安装了 Bazel https github com bazelbuild bazel releas
  • 根据第一列中的数字分割矩阵

    我有一个具有以下形式的矩阵 M 1 4 56 1 1 3 5 1 1 3 6 4 2 3 5 0 2 0 0 0 3 1 2 3 3 3 3 3 我想根据第一列中给出的数字分割这个矩阵 所以我想将矩阵拆分为 A 1 4 56 1 1 3 5
  • 如何取消 git bare 存储库中的最后一次提交?

    考虑到有几个 git 命令在裸存储库中没有任何意义 因为裸存储库不使用索引并且没有工作目录 git reset hard HEAD 不是取消提交此类存储库中最后更改的解决方案 通过互联网搜索 我能找到与该主题相关的所有内容this http
  • 通过 ADB 创建 AVD 配置文件

    有什么方法可以获取或查看所有设备的 Android 调试桥 Shell 中的属性 正如我所见 adb shell 仅显示和检索已连接的设备的当前会话的当前进程 我只是想知道有一个 adb shell 脚本命令可以查看该设备的所有技术产品信息
  • MSSQL Server Management Studio (SSMS) 2005 新查询模板

    如何更改 SSMS 2005 中的默认 新查询 模板 发布这个问题作为参考 我做了一些谷歌搜索 发现了一个简单的方法 http weblogs asp net cabhilash archive 2008 11 23 sql server
  • 双向绑定无法解析 setter

    我正在尝试了解数据绑定我有我的信用卡 ViewModel 类 它在我的片段中绑定 如下所示 public class CreditCardValidatorFragment extends Fragment private CreditCa
  • 如何自动获取本地时区的时区偏移量? [复制]

    这个问题在这里已经有答案了 我正在尝试自动获取本地时区偏移量 但遇到了麻烦 我试过了 print time timezone 3600 这会得到 当前错误的 偏移量 因为它不会自动调整夏令时和非夏令时 我也尝试过 now utc pytz
  • 将多个 pandas 数据框写入 Excel

    我正在尝试写多个pandasdataframes我从一个更大的数据集中提取到 Excel 工作簿的多个工作表中 问题是它只写入第一个数据帧 即index 0 因此生成的工作簿只有一个工作表 请参阅sheet1以下 我缺少什么 这是我的问题的
  • 一起滚动的水平列表视图列表 Flutter

    我想创建水平列表视图的垂直列表 我已经使用它实现了this https stackoverflow com questions 51089041 list of horizontal list in flutter 但我的问题是每个项目都单
  • 如何使用swift获取磁力计数据?

    我正在尝试使用 CoreMotion 从我的 iphone 6 获取磁场数据 我使用以下代码访问原始数据没有任何问题 if available motionMangager magnetometerUpdateInterval update
  • 如何在 pycharm 软件包安装中添加 --trusted-host ?

    我在 Windows 7 计算机上安装了 Pycharm 社区版 2016 1 4 并尝试更新我打算从事的项目使用的一些软件包 更新失败 因为本地存储库 不是受信任的主机或不安全的主机 根据pip 因此要在命令行中更新包 我需要运行 pip
  • “原子”更新整个数组

    我有一个编写器线程和一个读取器线程来更新和处理数组池 存储在地图中的引用 写入与读取的比率几乎为 5 1 写入的延迟是一个问题 编写器线程需要根据某些事件更新池中数组的几个元素 整个写入操作 所有元素 需要是原子的 我想确保如果编写器线程正