我正在尝试实现跨进程锁定,我只想要一个jvm来运行我的代码。在任何情况下,以下代码是否会中断?如果是这样如何让它牢不可破?
PS:以下代码取自here并根据我的要求进行修改。
public class TestMe
{
public static void main(String args[]) throws InterruptedException
{
try
{
if (crossProcessLockAcquire())
{
// Success - This process now has the lock.
System.out.println("I am invincible");
Thread.sleep(10000);
}
else
{
System.out.println("I am doomed");
}
}
finally
{
crossProcessLockRelease(); // try/finally is very important.
}
}
private static boolean crossProcessLockAcquire()
{
try
{
file = new File(System.getProperty("java.io.tmpdir") + File.separator + "file.lock");
if (!file.exists())
{
file.createNewFile();
}
RandomAccessFile randomAccessFile = new RandomAccessFile(file,
"rw");
FileChannel fileChannel = randomAccessFile.getChannel();
fileLock = fileChannel.tryLock();
}
catch (Exception e)
{
e.printStackTrace();
}
return fileLock == null ? false : true;
}
private static void crossProcessLockRelease()
{
if (fileLock != null)
{
try
{
fileLock.release();
fileLock = null;
if (file.exists())
{
file.delete();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
private static FileLock fileLock = null;
private static File file = null;
static
{
Runtime.getRuntime().addShutdownHook(new Thread()
{
public void run()
{
crossProcessLockRelease();
}
});
}
}
答案 0 :(得分:2)
它可以在这里打破:
file = new File(System.getProperty("java.io.tmpdir") + File.separator + "file.lock");
if (!file.exists())
{
file.createNewFile();
}
在您测试文件是否存在以及创建文件的时间之间,某些其他进程可能已创建它。
将其替换为目录并检查返回代码.mkdir()
(如果目录已存在则会失败),因为.mkdir()
在文件系统级别是原子的:
file = new File("/path/to/sentinel");
if (!file.mkdir())
someoneHasLocked();
当然,.delete()
关于“解锁”。