进程间文件锁定 Java
Inter-process file locking in Java
我没有找到任何具体的东西,只有像
that,未显示实现。
我需要创建一个在两个或多个进程(不是线程!)之间共享的文件锁。我需要在一个进程中的文件中 read/write 并保证没有其他进程同时写入该文件。 FileChannel.lock() 不执行此操作,因为只要存在锁,它就会抛出异常 (OverlappingFileLockException)。
我有两个关于如何实现进程间互斥锁的想法,但对我来说这两个想法都不太好。
重复锁定操作直到它起作用 - 非常恶心,但很简单,我想它应该起作用?
RandomAccessFile rFile = new RandomAccessFile(file, "rw");
FileChannel channel = rFile.getChannel();
FileLock lock;
boolean locked = false;
while(!locked) {
try {
lock = channel.lock();
locked = true;
} catch(OverlappingFileLockException e) {
Thread.sleep(10);
}
}
lock.release();
每当抛出异常时,将当前进程转换为服务器。使用 ServerSocket 监听其他进程,使用 Socket 传达 lock.release() 已被调用。这个对我来说就像用大炮打苍蝇一样
这两种方法中的任何一种都是处理我的问题的正确方法吗?或者是否已经存在允许跨进程锁定文件的 Java 机制?
try (RandomAccessFile raf = new RandomAccessFile(file, "rw")) {
while (raf.getChannel().tryLock() == null) {
Thread.sleep(10);
}
// lock acquired
}
try-with-resurces
块将自动释放锁(间接 - 通过关闭 RandomAccessFile
)。
顺便说一句,抛出 OverlappingFileLockException
是因为当前 JVM 已经拥有锁,或者当前 JVM 的线程已经在等待它。
我没有找到任何具体的东西,只有像 that,未显示实现。
我需要创建一个在两个或多个进程(不是线程!)之间共享的文件锁。我需要在一个进程中的文件中 read/write 并保证没有其他进程同时写入该文件。 FileChannel.lock() 不执行此操作,因为只要存在锁,它就会抛出异常 (OverlappingFileLockException)。
我有两个关于如何实现进程间互斥锁的想法,但对我来说这两个想法都不太好。
重复锁定操作直到它起作用 - 非常恶心,但很简单,我想它应该起作用?
RandomAccessFile rFile = new RandomAccessFile(file, "rw"); FileChannel channel = rFile.getChannel(); FileLock lock; boolean locked = false; while(!locked) { try { lock = channel.lock(); locked = true; } catch(OverlappingFileLockException e) { Thread.sleep(10); } } lock.release();
每当抛出异常时,将当前进程转换为服务器。使用 ServerSocket 监听其他进程,使用 Socket 传达 lock.release() 已被调用。这个对我来说就像用大炮打苍蝇一样
这两种方法中的任何一种都是处理我的问题的正确方法吗?或者是否已经存在允许跨进程锁定文件的 Java 机制?
try (RandomAccessFile raf = new RandomAccessFile(file, "rw")) {
while (raf.getChannel().tryLock() == null) {
Thread.sleep(10);
}
// lock acquired
}
try-with-resurces
块将自动释放锁(间接 - 通过关闭 RandomAccessFile
)。
顺便说一句,抛出 OverlappingFileLockException
是因为当前 JVM 已经拥有锁,或者当前 JVM 的线程已经在等待它。