缓存中的锁定策略 java
Lock strategy in cache java
我正在开发磁盘缓存(多线程)。缓存可以同时拥有多个用户。这就是为什么我可以写一些规则:
1) 当客户端读取文件时,缓存无法编辑(或删除)文件。
2) 当缓存正在编辑文件时,客户端需要等待编辑结束(读取文件后)。
我需要在 java 的帮助下组织这个锁策略。
我阅读了有关同步的内容(同步块和 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);
}
}
你可能不应该自己构建它,除非你这样做是为了好玩或为了学校作业。但是,除了有关于可移植性的警告(因此它可能无法在所有平台上以您期望的方式工作)之外,FileLock 应该可以完成这项工作。读取时,首先获取文件的共享锁,读取文件并在完成后释放锁,理想情况下是在 try-with-resources 块中。当你写的时候,取而代之的是获得一个独占锁(shared=false)。可以有多个读者,但只能有一个写者,有写者就没有读者。
我正在开发磁盘缓存(多线程)。缓存可以同时拥有多个用户。这就是为什么我可以写一些规则:
1) 当客户端读取文件时,缓存无法编辑(或删除)文件。
2) 当缓存正在编辑文件时,客户端需要等待编辑结束(读取文件后)。
我需要在 java 的帮助下组织这个锁策略。
我阅读了有关同步的内容(同步块和 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);
}
}
你可能不应该自己构建它,除非你这样做是为了好玩或为了学校作业。但是,除了有关于可移植性的警告(因此它可能无法在所有平台上以您期望的方式工作)之外,FileLock 应该可以完成这项工作。读取时,首先获取文件的共享锁,读取文件并在完成后释放锁,理想情况下是在 try-with-resources 块中。当你写的时候,取而代之的是获得一个独占锁(shared=false)。可以有多个读者,但只能有一个写者,有写者就没有读者。