Метод синхронизации для XML-файла - PullRequest
2 голосов
/ 08 февраля 2011

Я ищу метод синхронизации, чтобы гарантировать, что мои внутренние данные (XML-файл) сохранятся в целости во время доступа нескольких клиентов.

Я использую jaxb для чтения и записи в файл и из него. Я хочу убедиться, что когда клиент читает или записывает информацию в файл XML, другие клиенты не получают к нему доступ одновременно.

Я прочитал о ReadWriteLock и задаюсь вопросом, является ли это лучшим решением? Очевидно, что клиенты должны выполнить какой-то запрос, чтобы проверить, записывается ли что-либо в данный момент в файл, а если нет, то продолжить чтение / запись?

Я новичок в Java, чтобы оправдать свое невежество!

Спасибо

Ответы [ 2 ]

1 голос
/ 08 февраля 2011

Ваша проблема связана с разными "клиентами" - предположительно приложениями, работающими на разных JVM.

Если это так, класс ReadWriteLock не поможет. Этот класс предназначен для синхронизации разных потоков в одной JVM.

На самом деле вам нужен класс FileLock. Это блокирует файл или область файла от доступа другой виртуальной машины Java. Вам нужно сделать что-то вроде этого:

    FileInputStream fis = new FileInputStream("someFile");
    FileChannel fc = fis.getChannel();
    FileLock fl = fc.lock();  // or tryLock(), or etc
    // do stuff
    fl.release();
1 голос
/ 08 февраля 2011

Вы можете использовать ReadWriteLock .В основном это работает так:

При чтении файла используйте этот блок кода:

Lock l = readwriteLock.readLock();
l.lock();
try {
    // access the xml
} finally {
    l.unlock();
}

, при записи используйте это:

Lock l = readwriteLock.writeLock();
l.lock();
try {
    // access the xml
} finally {
    l.unlock();
}

Несколько потоков могут читатьфайл в то же время.Только один поток может писать одновременно.Всякий раз, когда вы вызываете l.lock () для блокировки чтения, он проверяет, заблокирована ли в данный момент блокировка записи.Если это так, он ожидает unlock () для блокировки записи.

Всякий раз, когда вы вызываете l.lock () для блокировки записи, он проверяет, есть ли одна (или несколько) заблокированных в настоящее время блокировок чтения.Если это так, он ожидает разблокировки всех блокировок.

Таким образом, вы никогда не сможете писать, когда другой поток читает.И вы никогда не сможете читать, когда пишет другой поток (но работает чтение из нескольких потоков одновременно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...