我正在尝试实现跨进程锁定,我只希望一个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();
}
});
}
}
最佳答案
它可以在这里中断:
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()
处于“解锁”状态。关于java - 在Java中实现跨进程锁定,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14278991/