如果 OverlappingFileLockException 仍然抛出,在 FileChannel.lock 中等待的目的是啥?

Posted

技术标签:

【中文标题】如果 OverlappingFileLockException 仍然抛出,在 FileChannel.lock 中等待的目的是啥?【英文标题】:What's the purpose of waiting in FileChannel.lock if OverlappingFileLockException is thrown anyway?如果 OverlappingFileLockException 仍然抛出,在 FileChannel.lock 中等待的目的是什么? 【发布时间】:2019-03-18 22:41:41 【问题描述】:

FileChannel.lock 允许在 Java 中创建文件锁(我使用How can I lock a file using java (if possible) 和FileOutputStream 的方法以避免NonWritableChannelException):

FileOutputStream out = new FileOutputStream(file);
try 
    java.nio.channels.FileLock lock = out.getChannel().lock();
    try 
        ...
     finally 
        lock.release();
    
 finally 
    out.close();

处理锁等待由持有资源的进程释放的重要部分。所以lock

将阻塞,直到该区域可以被锁定、该通道被关闭或调用线程被中断,以先到者为准。

但是,每次我尝试锁定同一个文件(跨越整个文件的区域)时,我都会得到一个 OverlappingFileLockException,它会被抛出

如果此 Java 虚拟机已持有与请求区域重叠的锁,或者如果另一个线程已在此方法中阻塞并正在尝试锁定重叠区域

这与锁定的逻辑相矛盾,并且无法使用文件锁定,因为如果队列中只允许一个线程(更多线程立即抛出OverlappingFileLockException),则必须手动同步资源访问。

使用lock(0, Long.MAX_VALUE, false),其中false 指的是shared 属性不会改变这种行为。

【问题讨论】:

【参考方案1】:

代表整个 Java 虚拟机持有文件锁。它们不适用于控制同一虚拟机内的多个线程对文件的访问。

读取“它们不能用于控制,因为每个 JVM 只能获取一个锁”。

“合适”在这种情况下可能意味着很多事情,包括与基于线程的锁相比效率低下的概念。当从多个线程访问文件时,必须使用它们来保护文件锁。

【讨论】:

当您调用filechannel.lock(start, end, true_or_false) 时,该区域是否可以被操作系统换出?或者说和系统调用mlock一样吗?

以上是关于如果 OverlappingFileLockException 仍然抛出,在 FileChannel.lock 中等待的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

检查记录是不是存在,如果是,则“更新”,如果不“插入”

Jquery“如果这个和如果那个”然后这样做

如果上游启动,Nginx 绕过缓存,如果关闭则使用缓存

如果新文件不存在则写入新文件,如果存在则追加到文件

数据库:如果存在则“更新”如果不存在则插入 [重复]

如果字段存在必须为真,但如果不存在则必须像真一样通过