我正在尝试实现跨进程锁定,我只希望一个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/

10-11 23:19