繁体   English   中英

字节数组以多线程读写

[英]byte array read and write in multithreads

我为线程分配了一个非常大的字节数组来读取和写入数组中的字节。 写操作是将新字节直接分配给数组中的值,如byte[i] = byte2;

我可以确保这些操作不会发生冲突(字节数组中的相同部分不会被2个不同的线程写入。当读取一个部分时,其他线程不执行写操作)。 我担心的是对阵列的修改是否可以立即用于其他线程。 我知道可能有内存栅栏,其他线程仍然可以读取数组中的旧值。

如果问题存在,该如何避免? volatile byte[] store; 在这种情况下工作?

将对阵列的修改立即提供给其他线程。

不是没有作家的写围栏和阅读器的阅读围栏。

我知道可能有内存栅栏,其他线程仍然可以读取数组中的旧值。

您将需要使用其中一个用于读取器和写入器(不是每个字节一个,每个操作一个)

将volatile []存储; 在这种情况下工作?

它不会做你想要的,虽然它会减慢你的应用程序。 当你这样做

store[i] = b;

当您正在读取对byte []的store引用时,这会添加一个读取栅栏。

最好的解决方案是使用Unsafe来完全控制这些读写操作。 请参阅AtomicIntegerArray的代码。

但是,如果不走这条路,你可以做一个像这样的虚拟操作,这种操作不是那么高效/优雅,但实现起来要简单得多。

private final AtomicBoolean fence = new AtomicBoolean();

public void readFence() {
    fence.get();
}

public void writeFence() {
    fence.set(true);
}

为此,必须在所有写入之后执行writeFence() ,并在所有读取之前执行readFence()

如果您正在使用更低级别的路由,您可能会发现使用堆内存是一个优势。 关闭堆内存可以存储非常大(TB)的数据量而不会影响GC。

您可以对此示例使用SynchronizedList

byte[] c = new byte[];
List list = Collections.synchronizedList(Arrays.asList(c));

它将是线程安全的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM