tre*_*sta 8 java concurrency performance locking data-structures
我有一个编写器线程和单个读取器线程来更新和处理数组池(存储在map中的引用).写入与读取的比率几乎为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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
655 次 |
| 最近记录: |