0

我正在开发磁盘缓存(多线程)。缓存可以同时拥有多个用户。这就是为什么我可以写一些规则:

1) 客户端读取文件时,缓存无法编辑(或删除)文件。

2) 当缓存正在编辑文件时,客户端应该等待编辑结束(并且在读取文件之后)。

我需要在 java 的帮助下组织这个锁策略。

我阅读了有关 synchronizatioan(同步块和 java.util.concurrent.Locks)的信息,据我所知,它在这里无济于事。

我试图理解 FileLock。但是当客户端读取文件时,缓存锁可以中止读取。如果客户端在读取之前会锁定文件,那么客户端读取的序列就会很长。我需要建议如何组织它(也许是另一种方式)。

更新

public void write(InputStream is) throws FileNotFoundException, IOException {

    File file = new File("path");

    try (FileOutputStream fos = new FileOutputStream(file);
            FileChannel filechannel = fos.getChannel();
            FileLock lock = filechannel.lock(0, Long.MAX_VALUE, false)) {

        // writing....

    }
}

public void read(OutputStream osToClient) throws IOException {

    File file = new File("path");

    try (FileInputStream fis = new FileInputStream(file);
            FileChannel filechannel = fis.getChannel();
            FileLock lock = filechannel.lock(0, Long.MAX_VALUE, true)) {

        IOUtils.copy(fis, osToClient);

    }

}
4

1 回答 1

1

你可能不应该自己建造这个,除非你是为了好玩或为了学校作业。但是,除了有关于可移植性的警告(因此它可能无法在所有平台上按您期望的方式工作)FileLock 应该可以完成这项工作。阅读时,首先获取文件的共享锁,读取文件并在完成后释放锁,最好是在 try-with-resources 块中。当你在写的时候,获取一个排他锁(shared=false)来代替。可以有多个读者,但只有一个写者,当有写者时,就没有读者了。

于 2018-03-16T14:51:20.743 回答