锁定缓存java中的策略

时间:2018-03-16 14:42:04

标签: java caching synchronized locks diskcache

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

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

2)当缓存是编辑文件时,客户端应该等待编辑结束(以及读取文件后)。

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

我读到了有关同步(synchronized block和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);

    }

}

1 个答案:

答案 0 :(得分:1)

你可能不应该自己构建这个,除非你为了娱乐或学校作业而这样做。但是,除了有关于可移植性的警告(因此它可能无法按照您期望的方式在所有平台上运行),FileLock应该完成这项工作。在阅读时,首先获取文件的共享锁,读取文件并在完成后释放锁,理想情况是在try-with-resources块中。在编写时,请获取独占锁(shared = false)。可以有多个读者,但只有一个作家,当有作家时,就没有读者。