[英]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.