"原子"更新整个阵列

tre*_*sta 8 java concurrency performance locking data-structures

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

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

我想确保读者线程读取先前更新的数组,如果编写器线程正在更新它(类似于易失性但在整个数组而不是单个字段).基本上,我可以负担得起读取陈旧的值,但不能阻止.

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

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

Zho*_*gYu 2

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

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

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)