我正在寻找一种同步方法,以确保在多个客户端访问期间我的后端数据(xml文件)保持不变。
我正在使用jaxb来读写文件。我想确保当客户端读取或写入xml文件的信息时,没有其他客户端同时访问它。
我已经阅读了关于ReadWriteLock
的内容,并想知道这是否是最佳解决方案?显然客户端应该运行某种查询来查看当前是否有任何文件写入文件,如果没有,那么继续进行读/写操作?
我对java有点新意,原谅我的无知!
由于
答案 0 :(得分:1)
您可以使用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()时,它会检查当前是否锁定了writelock。如果是,则等待writelock上的unlock()。
每当你在写锁定上调用l.lock()时,它会检查是否有一个(或多个)当前锁定的读锁定。如果是这样,它等待解锁所有锁。
这样,当另一个线程正在读取时,您永远无法写入。并且你永远不会在另一个线程写入时读取(但同时从多个线程读取工作)。
答案 1 :(得分:1)
您的问题涉及不同的“客户端” - 可能是在不同JVM中运行的应用程序。
如果是这种情况,ReadWriteLock
课程将无济于事。该类用于在单个JVM中进行不同线程的同步。
你真正想要的是FileLock
课程。这会锁定文件的文件或区域,以防其他JVM访问。你需要做这样的事情:
FileInputStream fis = new FileInputStream("someFile");
FileChannel fc = fis.getChannel();
FileLock fl = fc.lock(); // or tryLock(), or etc
// do stuff
fl.release();