在 Java 中锁定文件通道时出现 OverlappingFileLockException

Posted

技术标签:

【中文标题】在 Java 中锁定文件通道时出现 OverlappingFileLockException【英文标题】:Getting OverlappingFileLockException when locking file channel in Java 【发布时间】:2020-01-16 12:08:18 【问题描述】:

这是有问题的代码部分:

FileChannel fileChannel = FileChannel.open(filePath, StandardOpenOption.WRITE);
fileChannel.force(true);
FileLock lock = fileChannel.lock();
fileChannel.truncate(0);
fileChannel.write(buffer);
lock.release();
fileChannel.close();

buffer 是一个ByteBuffer,在此代码之前填充了一些数据。 因此,此代码在一个线程中定期完成,没有其他线程正在使用此锁或访问同一文件。当我在程序运行时使用记事本访问文件时,会发生什么情况,有时会得到OverlappingFileLockException。如果我捕捉到该异常,即使我关闭记事本,线程也会循环并一遍又一遍地生成相同的异常。我有时也会收到错误:The requested operation cannot be performed on a file with a user-mapped section open,它可能与 OverlappingFileLockException 相关,也可能不相关,但有时会出于同样的原因发生,当我在程序运行时使用记事本打开文件或打开文件属性时。

【问题讨论】:

当你说“定期”时,你是怎么做到的? 代码在while循环中。在循环结束时,线程休眠 100 毫秒。 【参考方案1】:

即使写入尝试引发 I/O 异常,也要确保释放锁。

FileChannel fileChannel = FileChannel.open(filePath, 
StandardOpenOption.WRITE);
fileChannel.force(true);

FileLock lock = fileChannel.lock();
try 
  fileChannel.truncate(0);
  fileChannel.write(buffer);

 finally 
  lock.release();
  fileChannel.close();

【讨论】:

谢谢,问题解决了,程序继续正常运行。但是你知道是什么导致了这种异常吗?锁不应该阻止记事本访问文件吗?或者如果记事本在锁之前打开,程序会在锁行等待直到它可以获得锁? @A6SE 这取决于平台 - 根据the documentation,“文件锁是独占的或共享的。共享锁可防止其他并发运行的程序获取重叠的独占锁, 但确实允许它们获取重叠的共享锁。独占锁可防止其他程序获取任一类型的重叠锁。一旦释放,锁对其他程序可能获取的锁没有进一步的影响。 i>"

以上是关于在 Java 中锁定文件通道时出现 OverlappingFileLockException的主要内容,如果未能解决你的问题,请参考以下文章

为啥在尝试更新 MySQL 条目时出现“超过锁定等待超时”错误?

启动mysql时出现错误:无法锁定./ibdata1,错误:11

在 SQLite 中创建视图时出现“数据库已锁定”错误

如何使用CRT和PEM文件在SSLcat中实现ssl(SSL_ERROR_NO_CYPHER_OVERLAP)

Android Soundpool 问题

将 IIS 从经典模式切换到集成模式时出现锁定和高 CPU