kay*_*ush 4 java linux filelock
我正在用 Java 创建一个应用程序,我只想运行一个实例。为此,我创建了一个文件并在我的应用程序运行时获得了一个锁。
我有以下代码适用于 Windows,但在 Linux 上失败:一旦我获得了一个锁而不解锁它,我可以获得另一个锁。
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
public class MyApp {
private static File f;
private static FileChannel channel;
private static FileLock lock;
public static void main(String[] args) {
try {
f = new File("RingOnRequest.lock");
// Check if the lock exist
if (f.exists()) {
// if exist try to delete it
f.delete();
}
// Try to get the lock
channel = new RandomAccessFile(f, "rw").getChannel();
lock = channel.tryLock();
if(lock == null)
{
// File is lock by other application
channel.close();
throw new RuntimeException("Only 1 instance of MyApp can run.");
}
// Add shutdown hook to release lock when application shutdown
ShutdownHook shutdownHook = new ShutdownHook();
Runtime.getRuntime().addShutdownHook(shutdownHook);
//Your application tasks here..
System.out.println("Running");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
catch(IOException e)
{
throw new RuntimeException("Could not start process.", e);
}
}
public static void unlockFile() {
// release and delete file lock
try {
if(lock != null) {
lock.release();
channel.close();
f.delete();
}
} catch(IOException e) {
e.printStackTrace();
}
}
static class ShutdownHook extends Thread {
public void run() {
unlockFile();
}
}
}
Run Code Online (Sandbox Code Playgroud)
每次运行时都会删除锁定文件,因此只有一个进程可以对其进行锁定。
当您使用 时FileLock,它纯粹是建议性的——获取文件上的锁可能不会阻止您做任何事情……即使另一个进程已获取锁,读取、写入和删除文件也可能都是可能的。有时,锁在特定平台上的作用可能不止于此,但这种行为是未指定的,并且依赖于超出类文档中保证的范围是失败的秘诀。
“建议锁”只是一个信号,其他进程费心寻找它是可见的。如果您对它的依赖不止于此,那么您的程序在其他平台上运行时就会中断。
你为什么要删除锁定文件呢?锁定文件就像一个布尔标志,对系统上的每个进程都是可见的。设计您的协议以这种方式使用它,您将拥有可靠的跨平台锁定机制。
| 归档时间: |
|
| 查看次数: |
9926 次 |
| 最近记录: |