0

複数のスレッドからアクセスされる共通のメソッドがあります。

     public void m(String fileName)
     {         
       FileOutputStream fos= new FileOutputStream(fileName);
       FileChannel fc = fos.getChannel();
       fc.tryLock();
       ....

fileName が 2 つ以上のスレッドで同じである場合があり、tryLock() または lock() を使用すると例外が発生します。ロックが既に取得されているかどうかを知るにはどうすればよいですか?

更新

import java.io.FileOutputStream;
import java.nio.channels.FileChannel;

class A implements Runnable{
    @Override
    public void run()
    {
        try
        {   
            FileOutputStream fos= new FileOutputStream("file.2txt");
            FileChannel fc = fos.getChannel();
            fc.tryLock();                                

            Thread.sleep(4000);

            fc.close();            
            System.out.println("done");
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }        
    }
}

public class Test 
{
    public static void main(String[] args) throws Exception 
    {
        new Thread(new A()).start();
        Thread.sleep(2000);
        new Thread(new A()).start();  
    }
}

例外があります:

java.nio.channels.OverlappingFileLockException
    at sun.nio.ch.FileChannelImpl$SharedFileLockTable.checkList(Unknown Source)
    at sun.nio.ch.FileChannelImpl$SharedFileLockTable.add(Unknown Source)
    at sun.nio.ch.FileChannelImpl.tryLock(Unknown Source)
    at java.nio.channels.FileChannel.tryLock(Unknown Source)
    at run.A.run(Test.java:14)
    at java.lang.Thread.run(Unknown Source)
4

2 に答える 2

2

ロックが既に取得されているかどうかを知るにはどうすればよいですか?

最良の答えは、を使用することfc.tryLock();です。ただし、例外をスローするべきではありません。nullロックを取得できない場合に返されます。これは、ロックがロックされていないかどうかを確認する最良の方法です。

FileChannel.tryLock()の javadoc から引用するには:

このメソッドはブロックしません。呼び出しは、要求された領域でロックを取得したか、取得に失敗したかのいずれかで、常にすぐに返されます。重複するロックが別のプログラムによって保持されているためにロックの取得に失敗した場合は、null を返します。他の理由でロックの取得に失敗した場合は、適切な例外がスローされます。

于 2013-06-13T15:45:41.613 に答える