多个RandomAccessFile对象能够向同一个文件写入数据吗?

4
 public class WriteThread extends Thread{

        @Override
        public void run() {
            RandomAccessFile randomAccessFile = new RandomAccessFile(fileName, "rwd");
            randomAccessFile.seek(threadPosition);
            byte[] buffer = new byte[1024 * 8];
            randomAccessFile.write(buffer, 0, threadLength);
        }
    }

在我的代码中,每个线程通过各自的RandomAccessFile对象向同一个文件写入数据。这是否需要进行同步处理?抱歉我的英语不太好。

需要进行同步 = 否(你的问题表明每个线程将拥有自己的RandomAccessFile实例,因此同步问题将在磁盘而非内存中)。这可能因操作系统而异。然而,确保线程不互相覆盖的责任将留给程序员(=你)。 - Sci Prog
1个回答

3

多个RandomAccessFile对象可以向同一个文件写入数据吗?

是的,在我们的Chronicle库中可以这样做。

  • Chronicle Queue 通过内存映射文件在多个JVM之间共享。
  • Chronicle Map 也可以通过内存映射文件在多个JVM之间共享。

在我的代码中,每个线程通过各自的RandomAccessFile对象将数据写入同一个文件。这需要进行同步吗?

你仍然需要考虑线程安全。使用synchronizedLock可以解决问题,但这不能跨越JVM。如果你有多个JVM,你需要使用共享锁或使用低级别的堆外线程安全操作。(这就是我们所做的,因为它是最快的选项)


@Jack,关于多个JVM访问同一个文件的问题,需要补充一下Peter的答案。FileLock API提供了必要的锁定机制。 - Madhusudana Reddy Sunnapu
@MadhusudanaReddySunnapu 我想补充一下,FileLock使用系统调用。 - Peter Lawrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接