我有一个可以被多个线程访问的通用方法,

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


有时两个或多个线程中的fileName可能相同,并且当我使用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)

最佳答案

我如何知道是否已获取锁?


最好的答案是使用fc.tryLock();。但是,它不应引发异常。如果无法获取锁,它将返回null。这是查看锁是否未锁定的最佳方法。

引用javadocs for FileChannel.tryLock()


  此方法不会阻止。调用总是立即返回,或者已经获得了对请求区域的锁定,或者没有成功获得锁定。如果由于另一个程序持有重叠锁而无法获取锁,则它将返回null。如果它由于任何其他原因未能获取锁,则将引发适当的异常。

关于java - 如何知道已获取锁,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17091366/

10-11 00:07