gpt4 book ai didi

java - "Atomically"更新整个数组

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:48:48 25 4
gpt4 key购买 nike

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

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

如果写入线程正在更新它(类似于 volatile 但在整个数组而不是单个字段上),我想确保读取线程读取先前更新的数组。基本上,我可以读取陈旧的值但不会阻塞。

此外,由于写入非常频繁,因此在读/写时创建新对象或锁定整个数组的开销非常大。

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

最佳答案

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

读取器线程,每当它进入需要数组的稳定快照的读取 session 时,将排队的更新应用到数组,然后读取数组。

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;
}

关于java - "Atomically"更新整个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15443906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com