我有一个编写器线程和一个读取器线程来更新和处理数组池(存储在地图中的引用)。写入与读取的比率几乎为 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(使用前将#替换为@)