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



在我的情况下,一些web配置文件是通过Docker中的mount文件夹共享的。在同样的情况下,我们希望同时修改这些文件。这就是为什么我想使用锁来确保文件在同一时间被修改一次。但我发现弗洛克不在多克工作。是否不支持?

 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) + "rn", 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());
    }
}

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

相关内容

  • 没有找到相关文章

最新更新