Linux OpenJDK 8中RandomAccessFile.close释放全进程文件锁问题咨询
文件锁释放异常问题排查与疑问
排查Bug时发现:当线程B调用RandomAccessFile.close()(在RandomAccessFile.getChannel().tryLock()调用失败后),该操作会释放JVM进程内其他线程(如线程A)持有的文件锁,甚至可能关闭目标文件的所有打开流。
示例代码
public class Locker { static FileLock lockFile(String path) { try { RandomAccessFile f = new RandomAccessFile(path, "rw"); try { FileLock lock = f.getChannel().tryLock(); return lock; // Thread-A gets the lock } catch(OverlappingFileLockException | IOException ex) { f.close(); //Thread-B fails and closes, but this also releases the lock of Thread-A return null; } } catch (Exception e) { throw new RuntimeException(e); } } public static void main(String[] args) throws Exception { final String path = args[0]; Thread t1 = new Thread(() -> lockFile(path)); Thread t2 = new Thread(() -> lockFile(path)); t1.start(); t2.start(); t1.join(); t2.join(); } }
验证结果
通过Linux命令lslocks查看活跃锁,发现调用f.close()后,JVM进程不再持有该文件锁。
疑问
- 该行为是否符合JDK的预期设计?
RandomAccessFile.close()是否会关闭JVM进程中目标文件的所有打开流?- 该现象仅在Linux环境出现,Windows机器上无法复现,是否属于Linux JVM Bug或特殊文件系统行为?
环境信息
- 操作系统:Redhat 4.18.0-348.2.1.el8_5.x86_64
- JDK版本:AdoptOpenJDK(build 1.8.0_212-b04)
内容的提问来源于stack exchange,提问作者PentaKon
相关产品推荐
相关产品推荐

