Стратегия блокировки в кеше java
Я занимаюсь разработкой дискового кэша (многопоточность). Кэш может иметь много пользователей одновременно. Вот почему я могу написать несколько правил:
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);
}
}
1 ответ
Вы, вероятно, не должны строить это самостоятельно, если вы не делаете это для развлечения или для школьного задания. Однако, за исключением того, что есть предупреждения о переносимости (поэтому она может работать не так, как вы ожидаете на всех платформах), FileLock должен выполнить эту работу. Когда вы читаете, сначала установите общую блокировку для файла, прочитайте файл и снимите блокировку, когда это будет сделано, в идеале - в блоке try-with-resources. Когда вы пишете, получите эксклюзивную блокировку (shared=false). Может быть несколько читателей, но только один писатель, и когда есть писатель, не может быть читателей.