クロス プロセス ロックを実装しようとしています。コードを実行する jvm は 1 つだけでした。次のコードはどのような状況でも壊れますか? もしそうなら、それを壊れないようにする方法は?
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();
}
});
}
}