1

クロス プロセス ロックを実装しようとしています。コードを実行する 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();
            }
        });
    }
}
4

1 に答える 1

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()「ロック解除」について。

于 2013-01-11T13:36:17.993 に答える