複数のスレッドからアクセスされる共通のメソッドがあります。
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)