Java 当锁定文件的另一个FileChannel关闭时,文件的独占锁定被降级

Java 当锁定文件的另一个FileChannel关闭时,文件的独占锁定被降级,java,nio,filelock,Java,Nio,Filelock,我为该文件获取独占FileLock,但当我为该文件创建另一个RandomAccessFile/FileChannel并将其关闭时,该FileLock将被降级,我可以从另一个进程获取该文件的FileLock 以下是更好地描述情况的可重复性测试 final String path = "/tmp/test.lck"; int sleep = 20_000; final File dbFile = new File(path); RandomAccessFile raf = ne

我为该文件获取独占FileLock,但当我为该文件创建另一个RandomAccessFile/FileChannel并将其关闭时,该FileLock将被降级,我可以从另一个进程获取该文件的FileLock

以下是更好地描述情况的可重复性测试

final String path = "/tmp/test.lck";
int sleep = 20_000;

final File dbFile = new File(path);
RandomAccessFile raf = new RandomAccessFile(dbFile, "rw");
final FileLock envLock = raf.getChannel().tryLock(0, 1, false);
System.out.println("Lock acquired " + envLock);

//WE ACQUIRE THE LOCK
//CHECK WITH LSOF you will see
//lsof test.lck
//COMMAND  PID      USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
//java    5088     fefe    4uw  REG  253,2        0 8128854 test.lck

//FILE IS PROPERLY LOCKED, YOU CANNOT OBTAIN LOCK FROM ANOTHER PROCESS !!!! 
//you can run this same program from another terminal and you will not be able to get the lock , tryLock method will return null

System.out.println("going to sleep  " + sleep);
Thread.sleep(sleep);
System.out.println("after sleep  " + sleep);

final File dbFile2 = new File(path);
RandomAccessFile raf2 = new RandomAccessFile(dbFile2, "rw");
raf2.close();    
System.out.println("channel released and closed");

//AFTER THE CHANNEL IS CLOSED, YOU CAN OBTAIN LOCK FROM ANOTHER PROCESSS !!!! <--- HERE IS THE PROBLEM
//you can run this same program from another terminal and you will be able to get lock

//WE CLOSE THE CHANNEL
//CHECK WITH LSOF you will see
//YOU CHAN SEE THE FD CHANGE FROM uw to u
//    COMMAND  PID      USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
//    java    5088      fefe    4u  REG  253,2        0 8128854 test.lck


System.out.println("going to sleep  " + sleep);
Thread.sleep(5 * sleep);
System.out.println("after sleep  " + sleep);
final String path=“/tmp/test.lck”;
int sleep=20_000;
最终文件dbFile=新文件(路径);
RandomAccessFile raf=新的RandomAccessFile(dbFile,“rw”);
final FileLock envLock=raf.getChannel().tryLock(0,1,false);
System.out.println(“获得锁”+环境锁);
//我们得到了锁
//请与LSOF联系,您将看到
//lsof test.lck
//命令PID用户FD类型设备大小/关闭节点名称
//java 5088 fefe 4uw REG 253,2 0 8128854 test.lck
//文件已正确锁定,您无法从其他进程获得锁定!!!!
//您可以从另一个终端运行相同的程序,但无法获得锁,tryLock方法将返回null
System.out.println(“进入睡眠状态”+睡眠);
睡眠;
System.out.println(“睡眠后”+睡眠);
最终文件dbFile2=新文件(路径);
RandomAccessFile raf2=新的RandomAccessFile(dbFile2,“rw”);
raf2.close();
System.out.println(“频道发布和关闭”);

//通道关闭后,您可以从其他进程获得锁 我无法在Windows上复制

发件人:

文件锁代表整个Java虚拟机持有

此文件锁定API旨在直接映射到底层操作系统的本机锁定功能。因此,文件上的锁应该对所有有权访问该文件的程序可见,而不管这些程序是用什么语言编写的

在某些系统上,关闭一个通道会释放Java虚拟机在基础文件上持有的所有锁,而不管这些锁是通过该通道还是通过在同一文件上打开的另一个通道获得的。强烈建议在程序中使用唯一通道来获取任何给定文件上的所有锁


我无法在Windows上复制

发件人:

文件锁代表整个Java虚拟机持有

此文件锁定API旨在直接映射到底层操作系统的本机锁定功能。因此,文件上的锁应该对所有有权访问该文件的程序可见,而不管这些程序是用什么语言编写的

在某些系统上,关闭一个通道会释放Java虚拟机在基础文件上持有的所有锁,而不管这些锁是通过该通道还是通过在同一文件上打开的另一个通道获得的。强烈建议在程序中使用唯一通道来获取任何给定文件上的所有锁