Java 中的 FileLock 在 Docker 挂载卷中不起作用

Posted

技术标签:

【中文标题】Java 中的 FileLock 在 Docker 挂载卷中不起作用【英文标题】:FileLock in Java doesn't work in Docker mount volume 【发布时间】:2020-11-11 17:06:39 【问题描述】:

在我的情况下,一些 Web 配置文件是通过 Docker 中的挂载文件夹共享的。在相同的情况下,我们希望同时修改这些文件。这就是为什么我想使用 lock 来确保文件同时被修改一次。但我发现flock 在Docker 中不起作用。不支持吗?

 public void modifyFile() 

    try 
        File file = new File("/tmp/fileToLock.dat");

        // Creates a random access file stream to read from, and optionally to write to
        FileChannel channel = new RandomAccessFile(file, "rw").getChannel();

        // Acquire an exclusive lock on this channel's file (blocks until lock can be retrieved)
        FileLock lock = null;

        // Attempts to acquire an exclusive lock on this channel's file (returns null or throws
        // an exception if the file is already locked.
        try 
            lock = channel.tryLock();
            if (null != lock) 
                List<String> fileToString = FileUtils.readLines(file, StandardCharsets.UTF_8);
                long l = 0l;
                if (null != fileToString && fileToString.size() > 0) 
                    l = Long.valueOf(fileToString.get(fileToString.size() - 1));
                
                l++;
                FileUtils.writeStringToFile(file, String.valueOf(l) + "\r\n", StandardCharsets.UTF_8, true);
            
         catch (OverlappingFileLockException e) 
            // thrown when an attempt is made to acquire a lock on a a file that overlaps
            // a region already locked by the same JVM or when another thread is already
            // waiting to lock an overlapping region of the same file
            System.out.println("Overlapping File Lock Error: " + e.getMessage());
            channel.close();
        

        // release the lock
        if (null != lock) 
            lock.release();
        
        // close the channel
        channel.close();

     catch (IOException e) 
        System.out.println("I/O Error: " + e.getMessage());
    


【问题讨论】:

网络文件锁总是有问题的,我相信FileLock的Javadoc是这么说的。 【参考方案1】:

最后,我只保留文件的任何锁定实现,没有任何 Redis 锁定。

【讨论】:

以上是关于Java 中的 FileLock 在 Docker 挂载卷中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Java NIO FileLock 允许其他进程写入锁定的文件

死磕NIO— 跨进程文件锁:FileLock

死磕NIO— 跨进程文件锁:FileLock

死磕NIO— 跨进程文件锁:FileLock

死磕NIO— 跨进程文件锁:FileLock

Java NIO总结